Python pyodbc Unicode 问题

rog*_*one 6 python unicode odbc utf-8 pyodbc

我有一个字符串变量 res,它是从 pyodbc 游标派生的,如底部所示。该表test有一行数据,ä其 unicode 代码点为u'\xe4'

我得到的结果是

>>> res,type(res)
('\xe4', <type 'str'>)
Run Code Online (Sandbox Code Playgroud)

而我应该得到的结果是。

>>> res,type(res)
(u'\xe4', <type 'unicode'>)
Run Code Online (Sandbox Code Playgroud)

我尝试将字符集作为 utf-8 添加到我的 pyodbc 连接字符串中,如下所示。结果现在已正确设置为 unicode,但代码点用于其他字符串?,这可能是由于 pyodbc 驱动程序中可能存在的错误。

conn = pyodbc.connect(DSN='datbase;charset=utf8',ansi=True,autocommit=True)
>>> res,type(res)
(u'\ua4c3', <type 'unicode'>)
Run Code Online (Sandbox Code Playgroud)

实际代码

import pyodbc
pyodbc.pooling=False
conn = pyodbc.connect(DSN='datbase',ansi=True,autocommit=True)
cursor = conn.cursor()
cur = cursor.execute('SELECT col1 from test')
res = cur.fetchall()[0][0]
print(res)
Run Code Online (Sandbox Code Playgroud)

其他详细信息 数据库:Teradata pyodbc 版本:2.7

那么我现在如何

1)投射('\xe4', <type 'str'>)(u'\xe4', <type 'unicode'>)(是否可以在没有无意副作用的情况下做到这一点?)

2) 解决 pyodbc/unixodbc 问题

Fer*_*ezi 13

对于 Python 3,请尝试以下操作:

conn = pyodbc.connect(DSN='datbase',ansi=True,autocommit=True)

放置这个:

conn.setdecoding(pyodbc.SQL_CHAR, encoding='utf8') conn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf8') conn.setencoding(encoding='utf8')

或者

conn.setdecoding(pyodbc.SQL_CHAR, encoding='iso-8859-1') conn.setdecoding(pyodbc.SQL_WCHAR, encoding='iso-8859-1') conn.setencoding(encoding='iso-8859-1')

ETC...

Python 2:

cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8') cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8') cnxn.setencoding(str, encoding='utf-8') cnxn.setencoding(unicode, encoding='utf-8')

ETC...

cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='encode-foo-bar') cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='encode-foo-bar') cnxn.setencoding(str, encoding='encode-foo-bar') cnxn.setencoding(unicode, encoding='encode-foo-bar')

  • 谢谢你!这对我在 MacOS 上使用 Python3 和 MySQL ODBC 8.0 ANSI 驱动程序很有帮助。 (3认同)

Bry*_*yan 3

我认为最好用 Python 来处理这个问题,而不是摆弄pyodbc.connect参数和特定于驱动程序的连接字符串属性。

\n\n

\'\\xe4\'是表示 unicode \xc3\xa4字符的Latin-1编码字符串。

\n\n

要在 Python 2.7 中显式解码 pyodbc 结果:

\n\n
>>> res = \'\\xe4\'\n>>> res.decode(\'latin1\'), type(res.decode(\'latin1\'))\n(u\'\\xe4\', <type \'unicode\'>)\n>>> print res.decode(\'latin1\')\n\xc3\xa4\n
Run Code Online (Sandbox Code Playgroud)\n\n

Python 3.x 为您执行此操作(str类型包括 unicode 字符):

\n\n
>>> res = \'\\xe4\'\n>>> res, type(res)\n(\'\xc3\xa4\', <class \'str\'>)\n>>> print(res)\n\xc3\xa4\n
Run Code Online (Sandbox Code Playgroud)\n