2017-02-16 1 views
2

python3.5 및 pyodbc/unixODBC를 사용하여 Informix 데이터베이스 테이블에서 데이터를 선택하는 데 문제가 있습니다. pyodbc/unixODBC를 사용하여 Python3에서 Informix 데이터베이스의 데이터를 선택하십시오.

는 좀 평 파일 (ifx.py) 내용이있는 사람인가요 :

import pyodbc 
db=pyodbc.connect('DSN=Test1') 
db.execute("SELECT * FROM customer ") 

을 나는 오류 얻을 : 뭔가를 암시했던

pyodbc.Error: ('HY000', '[HY000] [Informix][Informix ODBC Driver]Invalid byte in codeset conversion input. (21000) (SQLExecDirectW)') 

모든 검색 로케일 설정과 관련,하지만 난 확인하고 모든 설정하고 동일한 : 나는이 인 unixODBC 'isql을'유틸리티를 사용하는 경우

CLIENT_LOCALE=en_US.819 
DB_LOCALE=en_US.819 
dbs_collate=en_US.819 

나는 캘리포니아 n 데이터에 행복하게 접속하고 질의합니다.

버전 정보.

unixODBC.x86_64 0:2.2.14-14.el6 
pyodbc.version => '4.0.6' 
Linux => Red Hat Enterprise Linux Server release 6.8 
python3.5 => Python 3.5.3 
Database => IBM Informix Dynamic Server Version 12.10.FC6X5 
ClientSDK => IBM Informix CSDK Version 4.10, IBM Informix-ESQL Version 4.10.FC6 

환경 변수 ODBCINI가 /etc/odbc.ini를 가리 킵니다.

[ODBC Data Sources] 
Test1=IBM INFORMIX ODBC DRIVER 
; 
; Define ODBC Database Driver's Below - Driver Configuration Section 
; 
[Test1] 
Driver=/opt/informix/lib/cli/iclis09b.so 
Description=IBM INFORMIX ODBC DRIVER 
Database=eunice 
LogonID= 
pwd= 
Servername=indika_test 
Port=9916 
CursorBehavior=0 
CLIENT_LOCALE=en_US.819 
DB_LOCALE=en_US.819 
TRANSLATIONDLL=/opt/informix/lib/esql/igo4a304.so 

/etc/odbcinst.ini 내용 : 내용은

[ODBC Drivers] 
IBM INFORMIX ODBC DRIVER=Installed 
[IBM INFORMIX ODBC DRIVER] 
Driver=/opt/informix/lib/cli/iclit09b.so 
Setup=/opt/informix/lib/cli/iclit09b.so 
APILevel=1 
ConnectFunctions=YYY 
DriverODBCVer=03.51 
FileUsage=0 
SQLLevel=1 
smProcessPerConnect=Y 

및 -j 출력 odbcinst 어떤 도움이나 제안에 미리

unixODBC 2.2.14 
DRIVERS............: /etc/odbcinst.ini 
SYSTEM DATA SOURCES: /etc/odbc.ini 
FILE DATA SOURCES..: /etc/ODBCDataSources 
USER DATA SOURCES..: /etc/odbc.ini 
SQLULEN Size.......: 8 
SQLLEN Size........: 8 
SQLSETPOSIROW Size.: 8 

덕분이다.

답변

1

고객 테이블의 멀티 바이트 문자가 UTF8에서 라틴어 1, ISO 8859-1로 변환 될 수없는 것이 원인 일 수 있습니다. 동일한 코드가 CLIENT_LOCALE과 DB_LOCALE 모두에 설정되어 있더라도 ODBC 클라이언트는 UTF-8에서 8859로 내부 변환을 수행합니다. 2 바이트 문자 (확장 ASCII-255보다 큰 문자)가 있으면 Latin-1로 변환하지 않습니다 고객. 고객 표의 데이터를보고 문제가되는 데이터를 확인합니다.

+0

의견에 감사드립니다.하지만 내 테이블에 데이터가 아닌 것으로 의심됩니다. 나는 3 개의 기둥으로 작은 테이블을 만들었다. unixODBC를 통해 isql 데이터를 선택할 수 있습니다 : 'SQL> select * from jeff; + ----------- + --------- + ------------ + | _name | _code | _int | + ----------- + --------- + ------------ + | ABCDEFGHIJ | 12345678 | 123456789 | + ----------- + --------- + ------------ +' 파이썬을 통해 동일한 오류가 발생합니다. – JeffP

+0

@JeffP Do sqlite에 작은 테이블을 만들면 이런 종류의 에러가 발생합니까? 즉,이 데이터베이스 또는 데이터베이스에 연결하는 데 문제가 있는지 확인할 수 있습니까? – gregory

1

유니 코드 인코딩이 일치하지 않을 가능성이 있습니다. 데비안 시스템에서 파이썬 빌드 (2.7과 3.4)는 UCS-4 인코딩을 사용합니다. 이 명령으로 확인할 수 있습니다

python3 -c "수입 SYS, 인쇄 (sys.maxunicode < 66000 and'UCS2'or'UCS4 ')"당신은 인코딩을 찾으면

, 당신은 확인해야 Informix odbc.ini 파일의 유니 코드 인코딩은 동일합니다. 내 odbc.ini 파일에서,

[ODBC]

는, 유니 코드 연결

유니 코드를 아래 행의 주석을 해제 = UCS-4

나는이 문제를 해결하겠습니다.

0

감사합니다. 유니 코드가 맞지 않았습니다.

db=pyodbc.connect('DSN=Test1') 
db.setdecoding(pyodbc.SQL_WCHAR, encoding='UTF-8') 
db.setdecoding(pyodbc.SQL_CHAR, encoding='UTF-8') 
db.setencoding(encoding='UTF-8') 

setcode와 setdecoding을 추가함으로써 Informix DB에서 데이터를 성공적으로 선택할 수있었습니다.

관련 문제