升级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
相关产品推荐
相关产品推荐

