为啥mysql.connecter python准备好的语句在bytearray中返回字符串

Posted

技术标签:

【中文标题】为啥mysql.connecter python准备好的语句在bytearray中返回字符串【英文标题】:Why mysql.connecter python prepared statement returns string in bytearray为什么mysql.connecter python准备好的语句在bytearray中返回字符串 【发布时间】:2016-11-12 08:00:04 【问题描述】:

环境:Python 3.5.2、MySQL.Connector 2.0.4,在 MariaDB Server 10.1.14 上

为什么准备好的游标返回字节数组中的字符串值,而标准游标返回正常的字符串?

对于同一个实例的同一个调用,我的 Prepared 光标输出:

[(11, bytearray(b'1234567890'), None),
 (17, bytearray(b'1234567799'), bytearray(b'abc@outlook.com'))]

虽然 标准 版本提供了所需的输出:

[(11, '1234567890', None),
 (17, '1234567799', 'abc@outlook.com')]

标准版代码:

def query_userdb(query, arg):
    retVal = None
    cnx = mariadb.connect(**DB_CONFIG_USERS)
    cursor = cnx.cursor()
    cursor.execute(query, arg)
    if cursor.rowcount != 0:
        retVal = cursor.fetchall()
    cnx.commit()
    cnx.close()
    return retVal

对于 prepared 版本,我只将游标声明更改为

    cursor = cnx.cursor(prepared=True)

如何让准备好的游标正确返回字符串?

【问题讨论】:

你用的是mysql还是mariadb? ops,忘了说,我使用的是 MariaDB 10.1 实际上,我找到了一些相关的文档,可以深入了解问题原因dev.mysql.com/doc/relnotes/connector-python/en/news-2-0-0.html,但现在仍然能够解决它.. 【参考方案1】:

要获取字符串,您可以使用:

my_bytearray.decode("utf-8")

在你的情况下使用列表理解:

retVal = [(id,col2.decode("utf-8"),col3.decode("utf-8") for id,col2,col3 in retVal]

或者更好地处理第三列中的None 值:

retVal = [(id,col2.decode("utf-8"),(col3 if col3 is None else col3.decode("utf-8")) for id,col2,col3 in retVal]

【讨论】:

以上是关于为啥mysql.connecter python准备好的语句在bytearray中返回字符串的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ IDEA+Mysql connecter/j JDBC驱动连接

基于仿射的非刚体配准方法(i) 法向

python 爬虫数据准换时间格式

准系统 SWIG python C 接口在 OSX+clang 上出现段错误,而不是在 Linux+gcc 中

Python搭建一个steam钓鱼网站,只要免费领游戏,一钓一个准

nub点在哪里,nub看男女准吗