向Oracle写入带重音的字符

1 投票
1 回答
2658 浏览
提问于 2025-04-17 14:59

我需要更新一个现有的脚本,让它能把一些数据写入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使用指南,以获取更多详细信息。

撰写回答