Oracleのデータ移行時は移行元と移行先の文字コードに注意する必要があります。
Windows環境のOracleでは「JA16SJIS」や「JA16SJISTILDE」が標準の文字コードであり、Oracle 11g Express Edition(XE)では「AL32UTF8」が標準の文字コードです。
文字コードの違いは、sjisが1文字あたり1~2バイトで扱い、UTFは1文字あたり1~3バイトで扱います。
1文字あたりのバイト数が異なる為、文字列型(VARCHAR, VARCHA2)のデータを移行する場合にバイト数オーバーでエラーになる場合があります。
ここでは文字コードが「JA16SJISTILDE」のDBから「AL32UTF8」のXEへデータを移行すると想定した場合の移行方法を記載します。
案1 文字コードを変更する
移行元と移行先の文字コードを同じにしてデータ移行を行います。
Oracle 11g XEで文字コードを変更する場合は、1サーバ1インスタンスの制約がある為、データベースを再作成する必要があり、再作成時に文字コードを「JA16SJISTILDE」に指定します。
案2 定義を変更する
文字型を扱う単位をバイト数から文字数に変更してデータ移行を行います。
文字型の項目をVARCHAR2→NVARCHAR2に定義を変更してデータ移行を行います。
移行元で定義変更が難しい場合は、先に表定義のみインポートして定義変更後にデータを移行します。
1.表定義のエクスポート
expdp system/manager@orcl directory=ディレクトリ名 schemas=スキーマ名 dumpfile=ダンプファイル名 CONTENT=metadata_only -- VERSION=11.2.0 12cの場合に指定
2.表定義のインポート
impdp system/manager@xe directory=ディレクトリ名 schemas=スキーマ名 dumpfile=ダンプファイル名
3.表定義の変更
VARCHAR2の項目をNVARCHAR2に変更する
4.データのエクスポート
expdp system/manager@orcl directory=ディレクトリ名 schemas=スキーマ名 dumpfile=ダンプファイル名 CONTENT=data_only VERSION=11.2.0 -- VERSION=11.2.0 12cの場合に指定
5.データのインポート
impdp system/manager@xe directory=ディレクトリ名 schemas=スキーマ名 dumpfile=ダンプファイル名
または、Oracleパラメータ「NLS_LENGTH_SEMANTICS」を変更してデータ移行を行います。
パラメータを設定後にテーブルを作成する必要があります。テーブルをインポートして作成した場合は設定は反映されません。
SQL> show parameters nls_length_semantics; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ nls_length_semantics string BYTE SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS='CHAR'; セッションが変更されました。 SQL> show parameters nls_length_semantics; NAME ------------------------------------ TYPE VALUE -------------------------------------------- ------------------------------ nls_length_semantics string CHAR