[英]Python eyed3 UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 17: ordinal not in range(128)
[英]UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 54: ordinal not in range(128)
我知道,已经问过几次了,但没有一个答案给了我解决方案
这是代码(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"",使用和不使用所有可能的方式进行编码和解码,但仍然是相同的错误消息
有什么想法吗?
您正在向cursor.execute()
提供 Unicode SQL 语句。 该方法只能采用字节串 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'
只需使用以下参数进行连接:
connection = cx_Oracle.connect(connectString, encoding="UTF-8",nencoding="UTF-8")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.