2017-02-16 4 views
2

Ich habe ein Problem beim Auswählen von Daten aus Informix-Datenbanktabellen mit python3.5 und pyodbc/unixODBC.So verbinden Sie ausgewählte Daten aus der Informix-Datenbank in python3 mit pyodbc/unixODBC

Ich habe eine kleine py-Datei (ifx.py), deren Inhalt sind:

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

und ich erhalte eine Fehlermeldung:

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

Alle Such ich etwas bedeuten getan habe um mit Locale-Einstellungen zu tun, aber ich überprüfen und sie setzen alle gleich:

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

Wenn ich die unixODBC ‚isql‘ Dienstprogramm ich ca n Verbindung zu und Abfrage der Daten glücklich.

Versionsinformation.

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 

Umgebungsvariable ODBCINI verweist auf /etc/odbc.ini. Inhalte sind:

[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 Inhalt:

[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 

und odbcinst -J Ausgang ist

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 

Vielen Dank im Voraus für jede Hilfe oder Anregungen.

Antwort

1

Dies liegt wahrscheinlich an einem Multibyte-Zeichen in der Kundentabelle, das nicht in Latein 1, ISO 8859-1 von UTF8 konvertiert werden kann. Selbst mit denselben Codes, die auf CLIENT_LOCALE und DB_LOCALE gesetzt sind, führt ein ODBC-Client eine interne Konvertierung von UTF-8 nach 8859 durch. Wenn 2-Byte-Zeichen vorhanden sind (Zeichenketten jenseits der erweiterten ASCII-Werte 255), werden sie nicht in Latin-1 konvertiert Klient. Ich würde die Daten in der Kundentabelle betrachten und die problematischen Daten identifizieren.

+0

Danke für die Rückmeldung, aber ich vermute, es ist nicht in meiner Tabelle Daten. Ich habe eine kleine Tabelle mit 3 Spalten erstellt. Über unixODBC isql kann ich die Daten auswählen: 'SQL> select * von jeff; + ----------- + --------- + ------------ + | _name | _code | _int | + ----------- + --------- + ------------ + | ABCDEFGHIJ | 12345678 | 123456789 | + ----------- + --------- + ------------ + ' Durch Python bekomme ich den gleichen Fehler – JeffP

+0

@JeffP Do Sie erhalten diese Art von Fehler, wenn Sie eine kleine Tabelle in SQLite erstellen? Mit anderen Worten: Können wir feststellen, ob dies ein Problem bei der Verbindung mit dieser Datenbank oder einer Datenbank ist? – gregory

1

Es ist möglich (oder wahrscheinlich), dass ein Unicode-Codierungskonflikt vorliegt. Auf meinem Debian-System verwenden die Python-Builds (sowohl 2.7 als auch 3.4) die UCS-4-Codierung. "; Print (sys.maxunicode < 66000 and'UCS2'or'UCS4') import sys"

Sobald Sie die Codierung finden Sie sicherstellen müssen, dass

python3 -c: Sie können mit diesem Befehl überprüfen Die Informix odbc.ini-Datei hat dieselbe Unicode-Codierung. In meiner Datei odbc.ini

[ODBC]

; Kommentar- der folgenden Zeile für UNICODE Verbindung

UNICODE = UCS-4

Ich hoffe, dass dies Ihr Problem behebt.

0

Danke für die Antworten. Es war Unicode-Mismatch.

Mit setencoding und setdecoding konnte ich erfolgreich Daten aus der Informix DB auswählen.

Verwandte Themen