UnicodeEncodeError:“ascii”编解码器无法对位置54中的字符u'\xe9'进行编码:序号不在范围(128)

2024-10-01 07:44:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道,有人问过好几次了,但没有一个给我答案

下面是代码(Python2.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)

两张照片的结果如下:

^{pr2}$

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

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

我尝试过使用和不使用u”,有和没有编码和解码的所有可能的方式,但仍然是相同的错误消息

有什么想法吗?在


Tags: inimportdffor错误connoraclepd
1条回答
网友
1楼 · 发布于 2024-10-01 07:44:42

您正在向cursor.execute()输入Unicode SQL语句。该方法只能接受一个bytestringsql语句。在

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

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

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

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

^{pr2}$

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

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

相关问题 更多 >