将重音字符写入Oracle

时间:2013-02-06 16:19:14

标签: python 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变量的内容正确显示在屏幕上。

下面是写入db的代码(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 个答案:

答案 0 :(得分:2)

您的输入文件似乎是以Latin-1编码。将此解码为unicode数据; cx_Oracle将为您完成剩下的工作:

acct    = rec[ 84:104 ].decode('latin1')

或使用codecs.open() function打开文件进行自动解码:

inputfile = codecs.open(filename, 'r', encoding='latin1')

inputfile阅读将为您提供unicode个数据。

在插入时,cx_Oracle库会将unicode值编码为Oracle期望的正确编码。 需要在连接之前将NLS_LANG环境变量设置为AL32UTF8,无论是在shell中还是在Python中:

os.environ["NLS_LANG"] = ".AL32UTF8"

您可以查看Python Unicode HOWTO了解详情。