1

我必须更新现有脚本,以便将一些数据写入 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在插入之前/期间我是否需要对变量“做某事” ?

4

1 回答 1

2

您的输入文件似乎以 Latin-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,无论是在 shell 中还是在 Python 中:

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

您可能需要查看Python Unicode HOWTO以了解更多详细信息。

于 2013-02-06T16:37:46.877 回答