Lazarus/Linux中mysql_fetch_lengths()返回Int64数组的问题咨询
问题分析与解决方案
核心原因
Windows和Linux对C语言的unsigned long类型的字节宽度定义存在差异:
- Windows下
unsigned long为4字节,和Pascal的LongWord/UInt32完全匹配 - Linux下
unsigned long为8字节,对应Pascal的UInt64
你代码里硬编码将TMYSQL_LENGTHS的元素定义为LongWord,在Linux环境下会把8字节的长度值拆成两个4字节元素,这就导致了循环时项数翻倍、奇数索引值为0的现象(当长度值的高4字节为0时)。
修复方案
1. 用条件编译适配跨平台类型
修改类型定义,根据编译平台选择对应的匹配类型:
type {$IFDEF LINUX} TMySQLLength = UInt64; {$ELSE} TMySQLLength = LongWord; {$ENDIF} PMYSQL_LENGTHS = ^TMYSQL_LENGTHS; TMYSQL_LENGTHS = array[0..4095] of TMySQLLength; mysql_fetch_lengths: function(Result: PMYSQL_RES): PMYSQL_LENGTHS; cdecl;
2. 保持原有遍历逻辑
修改类型后,循环遍历字段的逻辑不需要改动,每个数组元素对应一个字段的长度,不会再出现拆分问题:
var LengthsPointer: PMYSQL_LENGTHS; i: Integer; begin LengthsPointer := mysql_fetch_lengths(FCurrentResults); if Assigned(LengthsPointer) then begin for i := 0 to NumFieldsInResult - 1 do ShowMessage(IntToStr(LengthsPointer^[i])); end; end;
补充说明
MySQL官方文档中提到的unsigned long是C语言原生类型,其字节宽度是平台相关的,并非固定4字节。Windows采用LLP64内存模型(long类型为4字节),而Linux采用LP64内存模型(long类型为8字节),这是跨平台CAPI绑定开发中常见的类型匹配陷阱。
内容的提问来源于stack exchange,提问作者Anse
相关产品推荐
相关产品推荐

