Windows下MySQL Connector 6.0.2调用mysql_stmt_bind_result绑定无符号整数报错
错误原因
你遇到的报错是Windows平台MySQL Connector/C 6.0.2预编译版本的特有缺陷,该版本的Windows预编译包中,对结果绑定的类型校验逻辑存在错误:当MYSQL_BIND结构体的is_unsigned字段设为1时,会错误的将MYSQL_TYPE_LONG、MYSQL_TYPE_TINY、MYSQL_TYPE_SHORT等基础整数类型判定为不支持的缓冲类型,触发Using unsupported buffer type: 3报错。同版本的macOS编译包没有该逻辑问题,因此跨平台表现不一致。
修复方案
有三种可行的修复方式,可根据你的实际场景选择:
- 升级连接器版本
该缺陷在Connector/C 6.1.0及更高版本中已被官方修复,直接升级到稳定高版本的连接器即可,原有绑定逻辑不需要做任何修改。 - 调整绑定类型适配现有版本
如果必须保留6.0.2版本,可以修改绑定配置:- 将
buffer_type改为MYSQL_TYPE_LONGLONG,is_unsigned保持为1,该版本对64位无符号整数的校验逻辑正常,即使存储的是32位无符号值也可以正常绑定读取 - 或者保持
buffer_type为原有类型,将is_unsigned设为0,读取到值后手动强转为无符号类型:
该方式需要确保业务侧的数值不会超过对应有符号类型的最大值,避免溢出导致转换错误。unsigned long real_val = (unsigned long)longStorage;
- 将
- 自行编译连接器
下载Connector/C 6.0.2的源代码在Windows本地编译,自行编译的版本不存在该预编译包的缺陷,可正常使用无符号整数绑定逻辑。
适配后的代码示例
// sql string is "SELECT some_ulong FROM some_table WHERE other_num='1'" // init, prepare, execute return 0, all is fine up to this point // here I try to bind to some_ulong unsigned long long ulongStorage; result[0].buffer_type = MYSQL_TYPE_LONGLONG; result[0].buffer = (void *)&ulongStorage; result[0].buffer_length = sizeof(unsigned long long); result[0].is_unsigned = 1; // 保留无符号标记,不会触发报错 result[0].is_null = &is_null[0]; result[0].length = NULL; // Bind result if (!returnCode) returnCode = mysql_stmt_bind_result (sqlStatement, &result[0]);
内容的提问来源于stack exchange,提问作者IgorD
相关产品推荐
相关产品推荐

