web-dev-qa-db-ja.com

Oracle DBエクスポート、NLS_LANGが設定されていない場合に可能な文字セット変換

あるサーバーからOracleデータベースをエクスポートし、別のサーバーにインポートする必要があります。しかし、最初に次の情報メッセージが表示されます。

接続先:Oracle Database 10gリリース10.2.0.4.0-US7ASCII文字セットで実行された64ビットの実動エクスポート、およびAL16UTF16 NCHAR文字セットサーバーがUTF8文字セットを使用(文字セット変換の可能性あり)

エクスポートはまだ警告なしで正常に終了しますが、データベース内のデータがまだ正しいかどうか疑問に思っていました。サーバーの文字セットと一致するようにNLS_LANG変数を設定する必要がありますか(この場合はUTF-8)?

NLS_LANG変数をUTF-8に設定した場合この情報メッセージが表示されません。しかし、データベースをインポートするターゲットサーバーは、次のように表示されます。

インポートはUTF8文字セットで行われ、AL16UTF16 NCHAR文字セットのインポートサーバーはAL32UTF8文字セットを使用します(可能な文字セット変換)

これらの2つのサーバーがUTF-8AL32UTF8の(少し)異なる文字セットを正しく使用していることを理解している場合。

NLS_LANG変数を設定する必要があるかどうか、または設定が必要かどうかさえ混乱しています。エクスポートとインポートにAL32UTF8NLS_LANGとして使用する必要がありますか?

編集:この情報が重要な場合:私はSUSE Linuxを使用しており、エクスポートにはOracleに付属のコマンドexpを使用します。

1
ap0

まず、文字セットUTF-8はOracleに存在しません。AL32UTF8またはUTF8(ハイフンなし)を使用してください。

通常、クライアントの文字セットがUTF-8の場合、エラーが発生します。

$ setenv NLS_LANG AMERICAN_AMERICA.UTF-8
$ sqlplus ...

ERROR:
ORA-12705: Cannot access NLS data files or invalid environment specified

文字セットUTF8は、BMP(Basic Multilingual Plane))の文字、つまりUnicodeの最初の65536文字のAL32UTF8と同じです。ほとんどの場合、アプリケーションのすべての文字が該当しますこの範囲内にあるため、違いはありません。AL32UTF8は一般的に呼ばれるものです TF-8 エンコーディング。Oracle文字セットUTF8は一般に CESU-8

NLS_LANG変数を設定しない場合、デフォルトでAMERICAN_AMERICA.US7ASCIIに設定されます。クライアントの文字セットをUS7ASCIIに設定することは、Oracleデータベースサーバーに次のように伝えます。「クライアントは7ビットを表示できます(のみ)ASCII文字とファイルは7で保存されます-bit ASCII format。 "したがって、データベースはエクスポート時にすべてのロシア語/キリル文字を?または¿に置き換えます。

NLS_LANGAL32UTF8に設定します(どのdatabase文字セットを設定しても)と、任意の文字を取得できます適切にエクスポートおよびインポートされます。

詳細については、次のドキュメントも確認してください。 NLS_LANG FAQ

1

NLS_LANGパラメータは、クライアントとデータベース間の文字変換を行うためにOracleネットワーク層で使用されます。このようにして、クライアントはデータベース内のすべての文字を「正しい」方法で表示できます。

きみの NLS_LANGは、エクスポートを行うときにデータベースの文字セットと一致する必要があります。 US7ASCIIでUTF-8データベースをエクスポートする場合、このデータをデータベースにインポートするときに情報が失われる危険があります。どうして? UTF-8文字セットは、US7ASCIIよりもはるかに多くの異なる文字を保持できます。 「不明な」文字は単一の文字に置き換えられます。過去に、アクセントのあるすべての文字を失ったことがこのように見られました。それらは「?」に置き換えられましたよく覚えていれば。

インポートする場合は、NLS_LANGは、インポートファイルの値に設定されます。 Oracleは、インポートしたデータベースの文字セットへのマッピングを行います。

1
Marco