2017-09-11 1 views
0

beschädigt Ich benutze Postgres auf Ubuntu und verwenden Sie unixodbc und pyodbc 4.0.16, um auf die Daten zuzugreifen. Ich habe anscheinend ein Problem im Zusammenhang mit Unicode. Bei der Abfrage der DB scheinen die Spaltenüberschriften beschädigt zu sein.Spaltenüberschriften sind bei der Abfrage mit pyodbc unter Ubuntu

Hier ist ein Beispiel:

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

Ich bin nicht sicher, was das Problem ist. BTW - genau das gleiche Verhalten wird auf meinem Mac (El Capitan) beobachtet.

Dank im Voraus, Alex

+1

Vielleicht versuchen 'conn.setdecoding (pyodbc.SQL_WMETADATA, encoding = 'utf-32le') 'zusätzlich zu den 'setdecoding'-Aufrufen, die Sie bereits haben. –

+0

Auch 'print (conn.getinfo (pyodbc.SQL_DRIVER_NAME) + '' + conn.getinfo (pyodbc.SQL_DRIVER_VER))' und sagen Sie uns, was es sagt. –

+0

Das Hinzufügen von conn.setdecoding (pyodbc.SQL_WMETADATA, encoding = 'utf-32le') hat das Problem gelöst! – user975383

Antwort

0

u'c\x00\x00\x00o\x00\x00' ist das erste 7 Bytes von 'column1' in UTF-32LE Codierung. (Der Wert wurde anscheinend bei 7 Bytes abgeschnitten, weil 'Spalte1' 7 Zeichen lang ist.)

pyodbc erhielt eine signifikante Aktualisierung der Unicode-Behandlung für seine 4.x-Version, und eines der Dinge, die die Entwickler entdeckten, ist das Überraschende eine Vielzahl von Möglichkeiten, wie ODBC-Treiber die Codierung bei der Rückgabe von Werten kombinieren können. Die Pyodbc Wikiseite für Unicode empfiehlt 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') 

aber in diesem Fall folgendes erforderlich war auch

cnxn.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-32le') 
Verwandte Themen