在Ubuntu上使用pyodbc查询时,列标题已损坏

时间:2017-09-11 03:12:09

标签: postgresql unicode pyodbc unixodbc

我在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)上观察到完全相同的行为。

提前致谢, 亚历

1 个答案:

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