向Oracle写入带重音的字符
我需要更新一个现有的脚本,让它能把一些数据写入Oracle 10g数据库。这个脚本和数据库都在同一台Solaris 10(Intel)机器上运行,使用的Python版本是v2.4.4。
我正在使用cx_Oracle,读写数据库没有问题。但是我写入的数据中有带重音的字符,这些字符写入后显示不正确,变成了倒问号。
这个值是通过以下代码从一个二进制文件中读取的:
class CustomerHeaderRecord:
def __init__( self, rec, debug = False ):
self.record = rec
self.acct = rec[ 84:104 ]
而acct
变量的内容在屏幕上显示是正确的。
下面是写入数据库的代码(acct
的值作为val_1
变量传入):
class MQ:
def __init__( self, rec, debug = False ):
self.customer_record = CustomerHeaderRecord( rec, debug )
self.add_record(self.customer_record.acct, self.cm_custid)
def add_record(self, val_1, val_2):
cur = conn.cursor()
qry = "select count(*) from table_name where value1 = :val1"
cur.execute(qry, {'val1':val_1})
count = cur.fetchone()
if count[0] == 0:
cur = conn.cursor()
qry = "insert into table_name (value1, value2) values(:val1, :val2)"
cur.execute(qry, {'val1':val_1, 'val2':val_2})
conn.commit()
但是acct
的值没有正确写入数据库。我在网上查了很多关于unicode和UTF-8的资料,但还没有找到能帮到我的。数据库中,NLS_LANGUAGE是'American',NLS_CHARACTERSET是'AL32UTF8'。
我需要在插入之前或期间对acct
变量做些什么吗?
1 个回答
2
你的输入文件看起来是用拉丁-1编码的。你需要把它解码成unicode
格式的数据;接下来,cx_Oracle会帮你处理剩下的事情:
acct = rec[ 84:104 ].decode('latin1')
或者你可以使用codecs.open()
函数来打开文件,这样可以自动解码:
inputfile = codecs.open(filename, 'r', encoding='latin1')
从inputfile
读取数据会得到unicode
格式的数据。
在插入数据时,cx_Oracle
库会把unicode
值转换成Oracle所需要的正确编码。在连接之前,你需要把NLS_LANG
环境变量设置为AL32UTF8
,可以在命令行中设置,也可以在Python中用:
os.environ["NLS_LANG"] = ".AL32UTF8"
你可能还想查看一下Python Unicode使用指南,以获取更多详细信息。