You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:38:14