使用MySQL Connector预处理游标时字符串列返回bytearray的问题排查
问题根因
2.1.8版本修复的Bug#27364914有明确生效前提,当前环境不满足前提,同时叠加了版本兼容问题,导致异常仍存在:
mysql-connector-python 2.2.9发布时Python 3.8尚未推出,该版本未适配Python 3.8的字节处理逻辑,原本的自动字符串解码流程无法正常触发。- 初始化数据库连接时未显式指定
charset参数。修复后的逻辑要求预处理游标必须基于显式声明的连接字符集执行解码,未指定时连接器会默认按二进制返回数据,即使表定义了utf8mb4字符集也不会自动解码。 - 2.2.9版本本身遗留了预处理协议的列字符集识别缺陷,即使显式指定了字符集,该版本也无法正确读取预处理结果中的列字符集标识,默认返回原始字节数据而非解码后的字符串。
解决方案
临时验证方案
- 连接时补充显式字符集配置:
db = mysql.connector.connect( host='xx', user='xx', password='xx', database='xx', charset='utf8mb4', use_unicode=True ) - 配置后仍返回bytearray的话,可在查询时对字符串列显式做字符集转换:
SELECT id, CAST(name AS CHAR CHARACTER SET utf8mb4) AS name FROM demo - 也可直接对返回结果手动解码:
# 对应示例中的name字段 real_name = row[1].decode('utf8mb4')
长期推荐方案
升级mysql-connector-python到8.0.30及以上的稳定版本,该系列版本完全适配Python 3.8+,修复了2.2.x版本遗留的预处理游标字符集识别问题,会自动按照连接字符集解码字符串列,无需额外处理。
内容的提问来源于stack exchange,提问作者ToniW
相关产品推荐
相关产品推荐

