2017-09-11 5 views
0

J'utilise postgres sur ubuntu et j'utilise unixodbc et pyodbc 4.0.16 pour accéder aux données. Je semble avoir un problème lié à unicode. Lors de l'interrogation du DB, les en-têtes de colonne semblent être endommagés.les en-têtes de colonne sont endommagés lors d'une requête avec pyodbc sur Ubuntu

Voici un exemple:

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

Je ne suis pas sûr de ce que la question est. BTW - exactement le même comportement est observé sur mon mac (el capitan).

Merci à l'avance, Alex

+1

Peut-être essayer 'conn.setdecoding (pyodbc.SQL_WMETADATA, encoding = 'utf-32LE') 'en plus des appels' setdecoding' que vous avez déjà. –

+0

Aussi, 'print (conn.getinfo (pyodbc.SQL_DRIVER_NAME) + '' + conn.getinfo (pyodbc.SQL_DRIVER_VER))' et dites-nous ce qu'il dit. –

+0

L'ajout de conn.setdecoding (pyodbc.SQL_WMETADATA, encoding = 'utf-32le') a en effet résolu le problème! – user975383

Répondre

0

u'c\x00\x00\x00o\x00\x00' est les 7 premiers octets de 'colonne1' dans le codage UTF-32LE. (La valeur était apparemment tronquée à 7 octets, car 'column1' comporte 7 caractères.)

pyodbc a reçu une mise à niveau importante vers la gestion Unicode pour sa version 4.x, et l'une des choses que les développeurs ont découvert est la Une variété de façons que les pilotes ODBC peuvent mélanger et assortir l'encodage lors du retour des valeurs. La page Wiki pyodbc pour Unicode recommande 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') 

mais dans ce cas ce qui suit a été également nécessaire

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