我在使用Python3.5和pyodbc/unixoDBC中选择数据数据库表中遇到问题。
我有一个小py文件(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)')
我所做的所有搜索都暗示与语言环境设置有关,但是我检查了它们,它们都设置了相同的设置:
CLIENT_LOCALE=en_US.819
DB_LOCALE=en_US.819
dbs_collate=en_US.819
如果我使用unixoDBC'isql'实用程序,我可以连接到数据并愉快地查询数据。
版本信息。
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
和odbcinst -j输出是
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
事先感谢您的任何帮助或建议。
这可能是由于客户表中的多键字符,该字符无法转换为UTF8的Latin 1,ISO 8859-1。即使在client_locale和db_locale上都设置了相同的代码,ODBC客户端也可以从UTF-8到8859进行内部转换。如果有任何2个字节chars(超过Extended-ascii 255的chars),他们不会转换为Latin-1-1客户。我会查看客户表中的数据并确定问题的数据。
有可能(或可能)有一个编码不匹配的Unicode。在我的Debian系统上,Python构建(2.7和3.4)使用UCS-4编码。您可以使用此命令验证:
python3 -c"导入sys; print(sys.maxunicode< 66000 and'ucs2'or'ucs4')"
找到编码后,您需要确保Informix Odbc.ini文件具有相同的Unicode编码。在我的odbc.ini文件中,
[ODBC]
;未点击Unicode Connection的下线
unicode = ucs-4
我希望这能解决您的问题。
感谢您的回复。这是Unicode不匹配。
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')
通过添加setEncoding和setDecoding,我能够成功选择数据表格Informix db。