簡體   English   中英

UnicodeEncodeError: 'ascii' codec can't encode character u'\\xe9' in position 54: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM