毎日たくさんの人がいることを知っているので、文字エンコードの質問をしてしまったことをお詫びしますが、私の問題を理解できなかったので、とにかく尋ねました。
これが私たちがしていることです:
- Pythonとを使用してOracleDBからデータを取得し
cx_Oracle
ます。 - Pythonを使用してデータをファイルに書き込みます。
- 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がどこかで混乱している可能性があります。
お時間をいただきありがとうございました。良い一日をお過ごしください。