我收到此错误消息
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc8 in position 38: ordinal not in range(128)
>>> import ibm_db
>>> conn = ibm_db.connect("sample","root","root")
>>> ibm_db.exec_immediate(conn,"select * from act")
我检查了默认编码,似乎是’utf8’:
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
我也知道this线程,人们在讨论相当类似的问题.其中一个建议是:
Have you applied the required database PTFs (SI57014 and SI57015 for 7.1 and SI57146 and SI57147 for 7.2)? They are included as a distreq,so they should have been in the order with your PTFs,but won’t be automatically applied.
但是,我不知道什么是数据库PTF以及如何应用它.需要帮忙.
PS.我正在使用Windows 10.
编辑
这是我收到错误消息的方式:
>>> print(ibm_db.stmt_errormsg())
Traceback (most recent call last):
File "
但是当我在DB2 CLP中运行相同的查询“select * from act”时,它就可以了.
这是驱动程序信息,我在Python中运行此代码:
if client:
print("DRIVER_NAME: string(%d) \"%s\"" % (len(client.DRIVER_NAME),client.DRIVER_NAME))
print("DRIVER_VER: string(%d) \"%s\"" % (len(client.DRIVER_VER),client.DRIVER_VER))
print("DATA_SOURCE_NAME: string(%d) \"%s\"" % (len(client.DATA_SOURCE_NAME),client.DATA_SOURCE_NAME))
print("DRIVER_ODBC_VER: string(%d) \"%s\"" % (len(client.DRIVER_ODBC_VER),client.DRIVER_ODBC_VER))
print("ODBC_VER: string(%d) \"%s\"" % (len(client.ODBC_VER),client.ODBC_VER))
print("ODBC_sql_CONFORMANCE: string(%d) \"%s\"" % (len(client.ODBC_sql_CONFORMANCE),client.ODBC_sql_CONFORMANCE))
print("APPL_CODEPAGE: int(%s)" % client.APPL_CODEPAGE)
print("CONN_CODEPAGE: int(%s)" % client.CONN_CODEPAGE)
ibm_db.close(conn)
else:
print("Error.")
它打印:
DRIVER_NAME: string(10) "DB2CLI.DLL"
DRIVER_VER: string(10) "10.05.0007"
DATA_SOURCE_NAME: string(6) "SAMPLE"
DRIVER_ODBC_VER: string(5) "03.51"
ODBC_VER: string(10) "03.01.0000"
ODBC_sql_CONFORMANCE: string(8) "EXTENDED"
APPL_CODEPAGE: int(1251)
CONN_CODEPAGE: int(1208)
True
编辑
我也试过这个:
>>> cnx = ibm_db.connect("sample","root")
>>> query = "select * from act"
>>> query.encode('ascii')
b'select * from act'
>>> ibm_db.exec_immediate(cnx,query)
Traceback (most recent call last):
File "
如您所见,在这种情况下,我也得到了相同的错误消息.
以下是我的所有观点:
C:\Windows\system32>chcp
Active code page: 65001
C:\Windows\system32>python
Python 3.4.4 (v3.4.4:737efcadf5a6,Dec 20 2015,20:20:57) [MSC v.1600 64 bit (AMD64)] on win32
Type "help","copyright","credits" or "license" for more information.
>>> import ibm_db
>>> cnx = ibm_db.connect("sample","root")
>>> ibm_db.exec_immediate(cnx,"select * from act")
Traceback (most recent call last):
File "
>提取并检查传入的参数(第4873至4918行).
>为查询分配本机对象(最多4954).
>执行查询并解码结果(函数的其余部分).
根据我们到目前为止的调查,您知道您为查询传入的数据格式正确(因此不是第1步).查看步骤2中的错误路径,您将看到解释这些故障的简单错误消息.因此,你在第3步失败了.
您在查询中引发了一个空的异常,当您尝试获取错误的详细信息时,您将获得另一个Unicode解码异常.这看起来像是ibm_db中的错误或配置错误,这意味着您的DB2安装不兼容.那我们怎样才能找出哪个……?
如其他地方所述,问题基本上与代码页有关.所有的ibm_db代码基本上都将字符串解释为ASCII(通过将它们转换为StringOBJ_FromASCII,它们向下映射到Python API,这些API继续接收ASCII字符 – 如果没有则会抛出unicode异常).
根据您的诊断,您可以尝试通过安装/配置您的系统(客户端和DB2服务器)来使用美国英语来证明/反驳此问题.这应该让你通过代码页不兼容,在这里找到真正的错误.
如果查询实际上是通过网络进行的,您可能只是获得一个网络跟踪,显示从服务器返回的响应.然而,基于您在日志中没有看到任何内容的事实,我不相信这会带来任何成果.
如果你不需要修补ibm_db代码来处理非ASCII内容 – 无论是通过维护者提出错误报告还是自己尝试(如果你知道如何构建和调试C扩展).