1

Oracle 10gデータベースにデータを書き込むように、既存のスクリプトを更新する必要があります。スクリプトとデータベースは両方とも同じSolaris10(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しません。私はユニコードと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が期待する正しいエンコーディングにエンコードします。接続する前に、シェルまたはPythonで次のように環境変数をに設定する必要がありますNLS_LANGAL32UTF8

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

詳細については、 PythonUnicodeHOWTOを確認することをお勧めします。

于 2013-02-06T16:37:46.877 に答える