1

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

http://tinyurl.com/nhhkf62

実際には次のようにデータベースに挿入されています。

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

http://tinyurl.com/orkv6z6

これは基本的に、先頭の 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がこのデータを変更している理由を知っている人はいますか? そして、それが起こらないようにする方法はありますか?

ありがとう

4

1 に答える 1

0

NLS_LANG は、暗黙的な文字変換で最も重要です。NLS_LANG=AMERICAN.UTF8 の代わりに NLS_LANG=AMERICAN_AMERICA.UTF8 であるべきだと思います

データベースの文字セットは何ですか?

于 2013-10-30T06:07:01.257 に答える