2017-09-11 16 views
0

私はubuntuでpostgresを使用しており、unixodbcとpyodbc 4.0.16を使用してデータにアクセスしています。私はユニコードに関する問題があるようです。 DBにクエリを実行すると、列ヘッダーが壊れているように見えます。Ubuntuでpyodbcを使用してクエリを実行すると、カラムヘッダーが破損する

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

はおそらく '(pyodbc.SQL_WMETADATA、エンコード= 'UTF-32LE' をconn.setdecodingを試す必要がありました) 'あなたがすでに持っている' setdecoding'呼び出しに加えて。 –

+0

また、 'print(conn.getinfo(pyodbc.SQL_DRIVER_NAME)+ '' + conn.getinfo(pyodbc.SQL_DRIVER_VER))'と言って、それが何であるか教えてください。 –

+0

conn.setdecoding(pyodbc.SQL_WMETADATA、encoding = 'utf-32le')を追加すると、実際に問題が解決しました。 – user975383

答えて

0

u'c\x00\x00\x00o\x00\x00'はUTF-32LEエンコードの 'COLUMN1' の最初の7バイトです。 ( 'column1'は7文字であるため、値は明らかに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') 
関連する問題