2017-09-11 1 views
0

우분투에서 postgres를 사용하고 unixodbc 및 pyodbc 4.0.16을 사용하여 데이터에 액세스합니다. 유니 코드와 관련된 문제가있는 것 같습니다. DB를 쿼리 할 때 열 머리글이 손상된 것으로 보입니다.우분투에서 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 인코딩 '컬럼 1'의 제 7 바이트이다. ('column1'은 7 자 길이이므로 값은 분명히 7 바이트에서 잘 렸습니다.)

pyodbc는 4.x 버전의 유니 코드 처리에 대한 중요한 업그레이드를 받았으며 개발자가 발견 한 놀라운 점 중 하나는 ODBC 드라이버가 값을 반환 할 때 인코딩을 혼합 및 일치시킬 수있는 다양한 방법 유니 코드에 대한 pyodbc 위키 페이지 권장 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') 
관련 문제