UnicodeEncodeError:' ascii'编解码器不能对字符u' \ xe9'进行编码。位置54:序数不在范围内(128)

时间:2016-05-10 10:14:21

标签: python python-2.7 cx-oracle python-unicode

我知道,已多次询问,但答案都没有给我一个解决方案

这是代码(Python 2.7):

import cx_Oracle
import pandas as pd

connstr = 'MyConstr'
conn = cx_Oracle.connect(connstr)
cur = conn.cursor()

xl = pd.ExcelFile("C:\\TEMP\\for_kkod.xlsx")
df = xl.parse(0)

for i in df.index:
    s = u"insert into MY_TABLE values({0}, '{1}')".format(int(df.iloc[i]['kkod']), df.iloc[i]['kkodnev'])
    print s
    print type(s)
    cur.execute(s)

2张照片的结果如下:

insert into MY_TABLE values(10, 'Készítés')
<type 'unicode'>

正如您所看到的,s的类型是unicode但是我有这样的错误消息:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 54: ordinal not in range(128)

我已尝试使用和不使用u&#34;&#34;,在所有可能的方式中使用和不使用编码和解码,但仍然是相同的错误消息

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您正在向cursor.execute()提供Unicode SQL语句。该方法只能采用 bytestring SQL语句

您不应该使用字符串插值将Unicode值插入SQL查询(它本身只是ASCII)。始终使用查询参数!

 s = "insert into MY_TABLE values(:0, :1)"
 cur.execute(s, (int(df.iloc[i]['kkod']), df.iloc[i]['kkodnev']))

现在要插入的值作为参数传递,并且由数据库适配器来担心编码这些正确(以及正确地转义值以避免SQL注入问题)。

以上使用编号(位置)参数,您也可以使用命名参数,使用匹配键传入字典中的值:

 s = "insert into MY_TABLE values(:kkod, :kkodnev)"
 cur.execute(s, {'kkod': int(df.iloc[i]['kkod']), 'kkodnev': df.iloc[i]['kkodnev']})

您必须确保正确配置连接和表列以处理Unicode。例如,您必须设置NLS_LANG选项:

import os
os.environ['NLS_LANG'] = '.AL32UTF8'

答案 1 :(得分:-1)

只需使用以下参数进行连接:

connection = cx_Oracle.connect(connectString,encoding =“ UTF-8”,nencoding =“ UTF-8”)