gpt4 book ai didi

python - 统一码编码错误 : 'ascii' codec can't encode character u'\xe9' in position 54: ordinal not in range(128)

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:30 27 4
gpt4 key购买 nike

我知道,已经问过好几次了,但是没有一个答案给我解决方案

这是代码(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)

两次打印的结果是这样的:

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"",使用和不使用所有可能的方式进行编码和解码,但仍然出现相同的错误消息

有什么想法吗?

最佳答案

您正在将 Unicode SQL 语句提供给 cursor.execute()。该方法只能采用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 注入(inject)问题)。

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

 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'

关于python - 统一码编码错误 : 'ascii' codec can't encode character u'\xe9' in position 54: ordinal not in range(128),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37135512/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com