2

毎日たくさんの人がいることを知っているので、文字エンコードの質問をしてしまったことをお詫びしますが、私の問題を理解できなかったので、とにかく尋ねました。

これが私たちがしていることです:

  1. Pythonとを使用してOracleDBからデータを取得しcx_Oracleます。
  2. Pythonを使用してデータをファイルに書き込みます。
  3. Pythonとを使用してファイルをPostgresに取り込みますpsycopg2

重要なOracle設定は次のとおりです。

SQL> select * from NLS_DATABASE_PARAMETERS;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               US7ASCII

このNLS_LANG FAQによると、クライアントOSが使用しているものに応じてNLS_LANGを設定することを目的としています。

実行localeすると:(LANG=en_US.UTF-8他のすべてのフィールドもen_US.UTF-8でした)。

したがって、Pythonスクリプトでは、次のように設定します。

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

次に、データをインポートしてファイルに書き込みます。

row = cur.fetchall()
fil.write(row[0][0]) #For this test, I am only writing one row and one field.

そのファイルをUTF-8PostgresDBに取り込みます。

残念ながら、何らかの理由で、次の記号が表示されます。ファイルと後続のPGテーブルにも。私の理解が正しければ、これは文字の置換です。Unicodeが記号を認識しない場合、文字が表示されることを意味していると思います。

(一部のテキストエディタでは、記号はとして表示されます�)。

私が理解していないのは、なぜこれが起こっているのですか?UTF-8は7ビットASCIIと下位互換性があると思いましたか?

また、リージョナルページを使用している場合でも、クライアントはUSを使用しており、OracleサーバーはAMERICANを使用しているため、機能しないはずです。

データが正しくインポートされているかどうかを確認するにはどうすればよいですか。正しくない場合は、将来のインポートが正しくなるように修正するにはどうすればよいですか。

注:OracleフィールドはCHARフィールドであり、フィールドではありませんNCHAR

注2:Python 2.4を使用しているため、Python3.XにはネイティブのUnicodeのものはありません。したがって、cx_Oracleがすべてを処理していると思っていたのに、Pythonがどこかで混乱している可能性があります。

お時間をいただきありがとうございました。良い一日をお過ごしください。

4

1 に答える 1