2015-04-05 29 views
2

我有一個字符串變量res,我從pyodbc光標派生出來,如下圖所示。 表test具有單行,其數據碼爲ä,其Unicode碼點爲u'\xe4'Python pyodbc統一編號問題

我得到的結果是

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

雖然我應該得到的結果。

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

我試着將charset作爲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

這是我想用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) 
ä 
+0

Thanks @Bryan今天我會試試這個。 – 2015-04-08 01:00:19

+0

感謝它按預期工作。但是我們的要求也是支持亞洲字符,所以我將使用通過jpype使用JDBC的JayDeBeApi。 – 2015-04-08 08:51:31

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

+0

感謝您發佈與當前版本的pyodbc(4.x及更高版本)相關的更新。有關詳細信息,請參見[pyodbc Wiki](https://github.com/mkleehammer/pyodbc/wiki/Unicode#teradata)。 – 2018-02-27 21:35:41