Python pyodbc Unicode问题

时间:2015-04-05 14:21:17

标签: python unicode utf-8 odbc pyodbc

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

我得到的结果是

>>> res,type(res)
('\xe4', <type 'str'>)

而我应该得到的结果是。

>>> res,type(res)
(u'\xe4', <type 'unicode'>)

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

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

实际代码

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)

其他细节 数据库:Teradata pyodbc版本:2.7

那我现在怎么样

1)将('\xe4', <type 'str'>)投射到(u'\xe4', <type 'unicode'>)(是否可以在没有无意的副作用的情况下执行此操作?)

2)解决pyodbc / unixodbc问题

2 个答案:

答案 0 :(得分:2)

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

'\xe4'是一个Latin-1编码的字符串,代表unicode ä字符。

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

>>> res = '\xe4'
>>> res.decode('latin1'), type(res.decode('latin1'))
(u'\xe4', <type 'unicode'>)
>>> print res.decode('latin1')
ä

Python 3.x为您(str type includes unicode characters)执行此操作:

>>> res = '\xe4'
>>> res, type(res)
('ä', <class 'str'>)
>>> print(res)
ä

答案 1 :(得分:1)

对于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')

等...

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')

等...

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')