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

升级MariaDB从10.5到11.6后mysql_fetch_field_direct无法返回正确数据类型

MariaDB 11.6升级后MYSQL_FIELD::type返回0的问题解决

问题根源

MariaDB 10.6及以上版本默认启用二进制协议作为通信协议后,mysql_fetch_field_direct返回的MYSQL_FIELD::type字段不再存储实际字段类型,会被固定设为0(对应MYSQL_TYPE_DECIMAL)。实际的原始字段类型被移至MYSQL_FIELD::org_type字段存储。

代码修复方案(推荐)

直接将代码中获取类型的逻辑从fls->type改为fls->org_type,这是官方推荐的适配方式,不会影响性能:

MYSQL_ROW row = mysql_fetch_row(m_hRes);
for(UINT nIndex = 0; nIndex < nFieldsCount; nIndex++)
{
    MYSQL_FIELD* fls = mysql_fetch_field_direct(m_hRes, nIndex);
    SQLType::e_Type eType = static_cast<SQLType::e_Type>(fls->org_type);
    // 后续逻辑...
}

服务器端配置方案(无需修改代码)

如果暂时无法修改代码,可以通过强制服务器使用文本协议恢复旧行为,但会牺牲部分查询性能:

  • 编辑MariaDB配置文件(my.cnf或my.ini),在[mysqld]段添加:
    default_protocol=TCP
    
  • 重启MariaDB服务生效。也可以在客户端连接时通过连接字符串指定protocol=TCP,强制使用文本协议。

额外验证

确认libmariadb.dll版本与MariaDB 11.6完全匹配,避免因客户端库版本不一致导致的兼容问题。

内容的提问来源于stack exchange,提问作者Timm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:33:16