我在使用csv和cx_oracle模块时遇到了一些麻烦。我想读一个以UTF-8保存的csv文件(我通过用UTF-8中的记事本保存它来检查它)。我现在可以读得很好(在我把它保存为UTF-8之前它没有)。这是我读取csv文件的代码:
with open(file, 'rt', encoding='utf-8') as csvfile:
csvinput = csv.reader(csvfile, delimiter = ',', quotechar = '"')
for row in csvinput:
data.append(row)
这会将所有内容保存到2D阵列。 每当我想在数据库中插入一些东西时,我都会做一个准备好的声明,并将文本加载到其中:
data = [lastname, firstname]
cursor = cx_Oracle.Cursor(connection)
cursor.prepare("SELECT * FROM PRIVATE WHERE NAME = :1 AND FIRSTNAME = :2")
cursor.execute(None, data)
res = cursor.fetchall()
cursor.close()
它给了我很多错误,如:
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 1: ordinal not in range(128)
我试着阅读整篇文章,但我对unicode事情感到困惑,因为我真的不知道应该在哪里使用什么以及为什么...... 任何帮助表示赞赏。 TLDR 我在尝试执行预准备语句时遇到编码错误
答案 0 :(得分:1)
您正在尝试将Unicode值插入VARCHAR2
列,该列只能处理编码的字节字符串。
cx_Oracle正在尝试对您的Unicode值进行编码以适合列类型,并使用默认的编解码器进行连接。
手动将您的值编码为合适的编码,或者改为使用NVARCHAR2
列。
后者的另一个优点是列长度以字符表示,而不是字节; UTF-8数据每个字符最多可以使用4个字节,因此在最坏的情况下,VARCHAR2(1000)
列只能容纳250个实际字符。