Python pyodbc Netezza';ascii';编解码器可以';t编码位置0-2的字符:序号不在范围内(128)

Python pyodbc Netezza';ascii';编解码器可以';t编码位置0-2的字符:序号不在范围内(128),python,encoding,pyodbc,netezza,unixodbc,Python,Encoding,Pyodbc,Netezza,Unixodbc,我是Python脚本新手,当我为Netezza DB调用将shell脚本转换为Python时,其中一个存储过程是通过传递的参数调用的。一切都按预期工作,并给出与shell相同的结果。但在一种情况下,如果一个参数为null,它将从Netezza表(Varchar字段)读取该数据。当我测试该场景并尝试打印从中读取的结果时,我遇到了一个奇怪的错误,即“'ascii'编解码器无法对位置0-2的字符进行编码:序号不在范围(128)”中。我尝试将值转换为字符串,但它不起作用。 附加脚本以供参考。 注意:脚本

我是Python脚本新手,当我为Netezza DB调用将shell脚本转换为Python时,其中一个存储过程是通过传递的参数调用的。一切都按预期工作,并给出与shell相同的结果。但在一种情况下,如果一个参数为null,它将从Netezza表(Varchar字段)读取该数据。当我测试该场景并尝试打印从中读取的结果时,我遇到了一个奇怪的错误,即“'ascii'编解码器无法对位置0-2的字符进行编码:序号不在范围(128)”中。我尝试将值转换为字符串,但它不起作用。 附加脚本以供参考。 注意:脚本可能不符合Python标准。欢迎对代码的改进提出建议

连接 从Netezza表读取数据 检查空参数dim列表 错误以

过程调用失败!!!错误:“ascii”编解码器无法对位置0-2中的字符进行编码:序号不在范围(128)内

谢谢
另一个错误消息是,它无法将字节解析为有效的ascii字符串。“字节解码”有一个处理错误的选项。您可以“忽略”或“替换”“替换”将在原始字节无法解析为ascii的位置填充问题字符

value = b''
val_str = value.decode("ascii", 'ignore')
对于ascii表格查找,可以将序号视为以字节为单位的十进制数


此问题可能与UTF-8转换有关。您的结果字段具有非unicode字段,这可能会导致问题。试试这个解决方案

参考:


Django地区也存在类似问题。这将让您了解它的来源。

感谢您的回复。我将尝试您提供的解决方案。我不明白为什么python odbc无法读取varchar字段。附加代码以供参考。我尝试了此操作,但返回了相同的错误“ascii”编解码器无法对位置0-2的字符进行编码:序号不在范围内(128)@如果您遇到同样的问题,请与ScottMcG分享您的想法。我猜您正在使用的库存在问题。conn_sugar/pyodbc可能有漏洞。如果是本机python代码,您可以深入挖掘源代码,并尝试通过跟踪回溯错误中的链接来修复它(不要捕获错误并将其打印到控制台)。如果您使用eclipse进行开发,您可以调试并尝试遵循execute/commit命令,或者您可以突出显示execute并点击F3(打开声明),以了解代码的位置和作用。F3可能不适用于某些库代码。我在表定义中使用的是Varchar而不是nvarchar。例如,我正在将值“Custom1”存储到此字段中,没有其他特殊字符。无论如何,我已经尝试了所有解码选项,但这并没有解决问题。我不确定这是否与Netezza驱动程序编码技术有关。在shell脚本中,我们是直接将此列值提取到变量而不存在任何问题
try:
    if str(results.dimList)=="":
        print "dimlist is  null"

        var_query="select  LP.DIMENSIONS AS DIMENSIONS from PICASO..LKP_PX_RECOMMEND_METADATA LP where LP.client_id="+results.clientID+""
        print var_query
        for row in cur_sugar.execute(var_query):
            print "line no 62"
            print row.DIMENSIONS 
        conn_sugar.commit();            
    else:
        print "dimlist is not null",results.dimList
        v=results.dimList

    cur_sugar.execute("{exec SQLTOOLKIT..UDP_PRC_GET_MEDIAPLAN_RECOMMENDATION_3004("+results.clientID+","+results.configID+","+results.jobinstanceID+",'"+results.convBegin+"','"+results.convEnd+"','"+results.jaMeta+"','"+results.sugarDB+"','"+results.dimList+"','"+results.flag+"')}")
    conn_sugar.commit();
    conn_sugar.close();
except Exception, e:
    print "procedure call failed!!! Error :",e
value = b''
val_str = value.decode("ascii", 'ignore')
value = bytes([97]) # a
val_str = value.decode("ascii", "ignore")
print(val_str)