pyodbc Netezza'ascii'编解码器无法编码位置0-2中的字符:序号不在范围内(128)

问题描述:

我是Python脚本编程新手,当我将shell脚本转换为Python以进行Netezza DB调用时,一个存储过程被调用传递参数。一切都按预期工作,并给出与Shell相同的结果。但在一种情况下,如果一个参数为null,它将从Netezza表(Varchar字段)读取该数据。在我测试该场景时并试图打印结果读取我有一个奇怪的错误,说''ascii'编解码器不能编码位置0-2字符:序号不在范围(128)“。我试图将值转换为字符串,但它是不工作。 附上脚本以供参考。 注:脚本可能不遵循Python的standards.Open任何改进建议代码的Netezza表 pyodbc Netezza'ascii'编解码器无法编码位置0-2中的字符:序号不在范围内(128)

try: 

连接

try: 
    conn_str ="DRIVER={NetezzaSQL};SERVER="+results.host+";PORT=5480;DATABASE="+results.sugarDB+";UID="+results.username+";PWD="+results.password+"" 
    print conn_str 
    conn_sugar = pyodbc.connect(conn_str,ansi=True) 

    cur_sugar = conn_sugar.cursor() 
    if (conn_sugar): 
     print "Connection successful" 

except Exception, e: 

    print "Error while creating Netezza connection Error:",e 

    sys.exit(-1) 

读取数据检查空参数列表暗淡

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 

错误作为

过程调用失败!!!错误:ASCII“编解码器在0-2位置无法编码的字符:顺序不在范围内(128)

由于 Anoopř

该错误消息是说,它不能解析字节为有效ascii字符串。字节解码可以选择如何处理错误。你可以'忽略'或'替换'。 'replace'将在原始字节不能被解析为ascii的地方填充一个问题字符。

value = b'' 
val_str = value.decode("ascii", 'ignore') 

将序号看作ascii表查找的十进制数字节。 http://www.asciitable.com/

value = bytes([97]) # a 
val_str = value.decode("ascii", "ignore") 
print(val_str) 
+0

感谢您的答复。我会尝试您给出的解决方案。我很困惑为什么varchar字段不可读python odbc.Attached代码以供参考。 –

+0

我试过这个,它返回相同的错误'ascii'编解码器不能编码字符位置0-2:序号不在范围内(128) –

+0

@ScottMcG分享你的想法,如果你遇到同样的问题 –

此问题可能与UTF-8转换有关。您的结果提交了非Unicode字段,可能会导致此问题。尝试此解决方案。

pyodbc remove unicode strings

参见:UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)

在Django的区域类似的问题。这会让你知道它起源于哪里。

+0

Bimal在表定义我使用Varchar不nvarchar.For示例我将值'Custom1'存储到此字段没有其他特殊字符.Anyways我已经尝试所有解码选项但是,这并没有解决问题。这是与Netezza驱动程序编码技术我不确定。在shell脚本中,我们直接将此列值提取到一个没有任何问题的变量 –