Python pyodbc Unicode 问题
Python pyodbc Unicode issue
我有一个字符串变量 res,它是从 pyodbc 游标派生的,如底部所示。
table 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 问题
这是我认为最好用 Python 处理的事情,而不是摆弄 pyodbc.connect 参数和特定于驱动程序的连接字符串属性。
'\xe4'
是一个 Latin-1 encoded string representing the unicode ä 字符。
显式解码 pyodbc 结果 Python 2.7:
>>> 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)
ä
对于 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')
我有一个字符串变量 res,它是从 pyodbc 游标派生的,如底部所示。
table 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 问题
这是我认为最好用 Python 处理的事情,而不是摆弄 pyodbc.connect 参数和特定于驱动程序的连接字符串属性。
'\xe4'
是一个 Latin-1 encoded string representing the unicode ä 字符。
显式解码 pyodbc 结果 Python 2.7:
>>> 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)
ä
对于 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')