ODBC データ ソースから Oracle データベースにデータをコピーする C++ データ変換プログラムを作成しています。移動するデータの量が非常に多い (数十億行) ため、C++ (配列操作あり) を選択しました。
現在、テキスト列は UTF-8 であると「想定」されていますが、常にそうであるとは限りません。そうでない場合でも、無効な生のバイトを Oracle にコピーしたいと考えています。後でクリーンアップします。列は単純なVARCHAR2(100)
ので、100 バイトの長さです。しかし、Oracle はデータに対してある種の UTF-8 解析/処理を試みているようです。
たとえば、次の文字列 (100 バイトに切り詰められているため、無効です):
Hex Bytes: 46 46 54 F0 9F 98 84 F0 9F 98 88 F0 9F 98 94 F0 9F 98 85 F0 9F 98 90 F0 9F 98 88 F0 9F 98 94 F0 9F 98 88 F0 9F 98 85 F0 9F 98 94 F0 9F 98 86 F0 9F 98 94 F0 9F 98 85 F0 9F 98 90 F0 9F 98 90 F0 9F 98 86 F0 9F 98 90 F0 9F 98 90 F0 9F 98 87 F0 9F 98 90 F0 9F 98 92 F0 9F 98 88 F0 9F 98 9A F0 9F 98 88 F0
実際には次のようにデータベースに挿入されています。
Hex Bytes: 46 46 54 EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD
これは基本的に、先頭の 3 つの ascii 文字であり、その後に続く各バイトの U+FFFD の UTF-8 エンコードが続きます。
その他の詳細:
Oracle Version: 11g Enterprise Edition Release 11.2.0.1.0
Oracle Client: oracle-instantclient11.2-basic-11.2.0.3.0-1
Oracle OCI rpm: oracle-instantclient11.2-devel-11.2.0.3.0-1
Environment: LANG=en_US.UTF-8
Environment: NLS_CHARACTERSET=AMERICAN_AMERICA.UTF8
Environment: NLS_LANG=AMERICAN.UTF8
OracleやOCIがこのデータを変更している理由を知っている人はいますか? そして、それが起こらないようにする方法はありますか?
ありがとう