我在ubuntu上使用postgres并使用unixodbc和pyodbc 4.0.16来访问数据。我似乎有一个与unicode有关的问题。 查询数据库时,列标题似乎已损坏。
以下是一个例子:
import pyodbc
conn = pyodbc.connect("DSN=local_postgres")
conn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
conn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
#conn.execute('create schema test')
conn.execute('create table test.uni_test(column1 varchar)')
conn.execute("insert into test.uni_test(column1) values ('My value')")
results = conn.execute('select * from test.uni_test')
print results.description
columns = [column[0].decode('latin1') for column in results.description]
print "columns: " + str(columns)
print list(results)
Result:
((u'c\x00\x00\x00o\x00\x00', <type 'str'>, None, 255, 255, 0, True),)
columns: [u'c\x00\x00\x00o\x00\x00']
[(u'My value', )]
我不确定问题是什么。 BTW - 在我的mac(el capitan)上观察到完全相同的行为。
提前致谢, 亚历
答案 0 :(得分:0)
u'c\x00\x00\x00o\x00\x00'
是&#39; column1&#39;的前7个字节。在UTF-32LE编码中。 (该值明显被截断为7个字节,因为&#39; column1&#39;长度为7个字符。)
pyodbc对其4.x版本的Unicode处理进行了重大升级,开发人员发现的一件事是ODBC驱动程序在返回值时可以混合匹配编码的各种令人惊讶的方式。 Unicode的pyodbc Wiki页面推荐the following for PostgreSQL ODBC under Python 2.7
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
但在这种情况下还需要以下内容
cnxn.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-32le')