質問: ### 質問 oracle DBでのDMPインポートで文字化けが起きる原因を正確に理解したいです。 ご教示よろしくお願い致します。 ### 試したこと oracleDBをエクスポートして、別のoracleDBに対してインポートを行いました。 ### 考察 私の現時点での理解では ・エクスポート元DMPの文字コードとimpコマンド実行前のNLS_LANGが同じであれば、文字化けは起きない ・エクスポートする前に「set NLS_LANG=american_america.al32utf8」を設定しないとエクスポートしたDMP自体が文字化けするため、DOS窓で指定した文字コードに関わらず、インポート時には文字化けする と思っています。 ※上記間違っている箇所あればご指摘いただけると嬉しいです。 ### 補足情報 ・DBのバージョン:Oracle Database 11g Release 11.2.0.3.0 - 64bit Production ・sqlplusを起動する環境はwindows(私が使用しているのはwin10) ・DBサーバに関しては全てlinux ・エクスポート元、インポート先のDBのNLS_CHARACTERSETは両方とも「AL32UTF8」
回答: >・エクスポート元DMPの文字コードとimpコマンド実行前のNLS_LANGが同じであれば、文字化けは起きない 正しいです。 >・エクスポートする前に「set NLS_LANG=american_america.al32utf8」を設定しないとエクスポートしたDMP自体が文字化けするため、DOS窓で指定した文字コードに関わらず、インポート時には文字化けする 微妙ですが、正しいです。 微妙というのは、この2点目はあなたの補足情報にある「・エクスポート元、インポート先のDBのNLS_CHARACTERSETは両方とも「AL32UTF8」」という前提に立った場合のみ正しいからです。 この仕様については基本的にOSやバージョンによって違いはありません。 正しい理解のためには、NLS_CHARACTERSETとNLS_LANGの関係と、Oracleによる文字コード変換の仕様を把握する必要があります。 まず、exp時は、NLS_CHARACTERSETとNLS_LANGが一致していた場合、内部的に文字コード変換が実行されず、そのままDMPファイルにデータが出力されます。 一致していなかった場合、NLS_LANGで指定された文字コードにOracleが内部的に変換を行って出力してくれます。 なので基本的にはこの段階では文字化けというのは発生しません。 基本的というのは、UTF→SJISのように文字コードセットが狭いコードに変換させてしまうと必ず文字化けが発生してしまう、という意味です。 imp時も基本的に同じです。