【发布时间】:2021-01-05 13:02:05
【问题描述】:
给定这样的 MySQL 表:
create table demo (id int, name varchar(100)) collate utf8mb4_general_ci;
insert into demo values (1,'abcdef');
还有 Python 脚本:
import mysql.connector
db = mysql.connector.connect(host='xx', user='xx', password='xx', database='xx')
cursor = db.cursor()
cursor.execute('select * from demo')
for row in cursor:
print(row)
这会产生预期的结果:
(1, 'abcdef')
如果我将光标更改为准备好的光标:
cursor = db.cursor(prepared=True)
结果出乎意料:
(1, bytearray(b'abcdef'))
我正在使用 Python 3.8.0 和 mysql.connecter 版本 2.2.9 在 MySQL 连接器 2.1.8 (https://dev.mysql.com/doc/relnotes/connector-python/en/news-2-1-8.html) 的发行说明中,我阅读了
使用准备好的语句时,字符串列作为字节数组而不是字符串返回。返回的值现在是使用连接的字符集(默认为 'utf8')解码的字符串,或者如果此转换失败,则作为字节数组。 (错误号 27364914)
所以我没想到我正在使用的版本中的行为。
我错过了什么?
【问题讨论】:
-
这似乎是一个错误。 FWIW 该行为在最新版本(8.0.22)中不可重现。注意这个版本必须安装
pip install mysql-connector-python见dev.mysql.com/doc/connector-python/en/… -
感谢@snakecharmerb 的这个指针,这解决了我的问题,作为奖励,现在性能要好得多。但是就像下面的 Booboo 注意到的,使用准备好的语句的性能似乎比没有准备好的要差。令人费解。