IBM Support

[DB2 LUW] IMPORT/EXPORT における文字化けおよび文字の切捨ての回避方法

Troubleshooting


Problem

EXPORT したデータを IMPORT すると、文字が化けたり欠落することがあります。 この文書では文字化けの原因と解決方法について記述します。

Symptom

EXPORT および IMPORT を使ってデータを移動させると、IMPORT 先で以下のような問題が起きることがあります。
  1. すべての文字が文字化けする
  2. 一部の文字が置換文字 (0xFCFC など) へ置き換えられる
  3. 一部の文字が入れ替わる
  4. 列の後ろの文字が切り捨てられる

Cause

それぞれの症状は以下の原因で発生します。
  1. すべての文字が文字化けする
    EXPORT されたファイルのエンコーディングと IMPORT のコード・ページが一致していない。
    (例) CCSID 943 (SJIS) のファイルとして EXPORT したものを、CCSID 954 (EUC-JP) のファイルとして IMPORT する。
  2. 一部の文字が置換文字 (0xFCFC など) へ置き換えられる
    データベースのコード・セットより EXPORT されたファイルのコード・セットが小さい。
    (例) コード・セット 1208 (UTF-8) のデータを、943 (SJIS) のファイルへ EXPORT する。
  3. 一部の文字が入れ替わる
    EXPORT の時の変換ルールと IMPORT の時の変換ルールが異なる。
    (例) EXPORT 時は 932 -> 932 (無変換) を採用し、IMPORT 時は 943 -> 932 の変換ルールを採用する。
  4. 列の後ろの文字が切り捨てられる
    データベース・コードページと、EXPORT を行う CLP のコードページが異なり、エンコード後の文字列長が長くなるために、規定の列長に入らずデータが切り捨てられる。

Resolving The Problem

EXPORT および IMPORT は、データベース・コード・ページと、コマンド行プロセッサー (CLP) のコード・ページの間で文字コード変換が行われます。
変換は以下の 3 つのケースに分類されるため、該当するケースを採用してください。

注1:
以下のコマンドは UNIX/Linux での例です。Windows の場合は export コマンドの代わりに set コマンド、grep コマンドの代わりに findstr コマンドを使います。
注2:
CLP に DB2CODEPAGE の変更を反映させるためには CLP の再起動が必要です。db2 terminate コマンドは CLP を再起動させる目的で使用されているため、必ず実行してください。

ケース 1) EXPORT 元のデータベースと IMPORT 先のデータベースのコード・ページが一致している場合

EXPORT および IMPORT を実行する CLP のコード・ページを、データベース・コード・ページと一致させます。

実行例
$ db2 get db cfg for <元データベース> | grep "コード・ページ"
Database code page       = 1208
$ db2 get db cfg for <宛先データベース> | grep "コード・ページ"
Database code page       = 1208

EXPORT
$ export DB2CODEPAGE=1208
$ db2 terminate
$ db2 connect to <元データベース>
$ db2 export to ....

$ export DB2CODEPAGE=
$ db2 terminate

IMPORT
$ export DB2CODEPAGE=1208
$ db2 terminate
$ db2 connect to <宛先データベース>
$ db2 import from ....

$ export DB2CODEPAGE=
$ db2 terminate

ケース 2) EXPORT 元のデータベースと IMPORT 先のデータベースのコード・ページが一致しない場合

変換が一度だけになるように設定します。たとえば EXPORT で元データベースのコード・ページに変換し、IMPORT で変換を行います。

注: 宛先データベースの方が、エンコード後のバイト数が大きくなる場合、かつ IXF のように元データベースの文字列長を保持するファイル形式を使う場合、DB2CODEPAGE として元データベースのコード・ページを設定する必要があります。例えば、以下の例で IXF ファイルを使う場合に DB2CODEPAGE=1208 を指定すると文字が欠落する可能性があります。

実行例
$ db2 get db cfg for <元データベース> | grep "コード・ページ"
Database code page       = 943
$ db2 get db cfg for <宛先データベース> | grep "コード・ページ"
Database code page       = 1208

EXPORT
$ export DB2CODEPAGE=943
-> 元データベースのコード・ページと一致させます。
$ db2 terminate
$ db2 connect to <元データベース>
$ db2 export to ....
-> EXPORT されたファイルは 943 (Shift JIS) でエンコードされています。

$ export DB2CODEPAGE=
$ db2 terminate

IMPORT
$ export DB2CODEPAGE=943
-> EXPORT されたデータのコード・ページと一致させます。こうすることで IMPORT は正しい変換を保証します。
(ただし、IXF の場合は IXF ファイル自体にコードページが記録されているため DB2CODEPAGE の影響を受けません)

$ db2 terminate
$ db2 connect to <宛先データベース>
$ db2 import from ....

$ export DB2CODEPAGE=
$ db2 terminate

扱える文字集合が小さいデータベースに IMPORT すると、IMPORT 先で扱えない字形が置換文字に置き換えられます。
このようなケースを避けるため、IMPORT 先データベースは EXPORT 元と同じか、より大きい文字集合を扱えるコード・セットを選択してください。

ケース 3) EXPORT 元のデータベースより IMPORT 先のデータベースの文字集合が小さい場合

EXPORT 元と同じ、もしくはより大きい文字集合をサポートするデータベースに IMPORT します。
日本語をサポートする主なコード・ページは、文字集合の大きい順に 1208 (UTF-8) > 943 (SJIS) > 954 (EUC-JP) です。


運用時の考慮点
DB2CODEPAGE 変数は考慮点が多いため、レジストリー変数ではなく環境変数で一時的に設定します。
また、DB2CODEPAGE の変更を CLP に反映させるため、db2 terminate コマンドで CLP を再起動する必要があります。

ADMIN_CMD() から IMPORT または EXPORT を実行する場合、明示的にアプリケーション・コードページを指定できないため、変換の結果は不定です。
このため、MODIFIED BY CODEPAGE オプションを利用し、明示的に入力/出力ファイルのコードページを指定してください。

関連情報
  • IXF 形式で EXPORT した場合、他システムにファイル転送するにはバイナリー・モードを選択します。DEL および ASC で EXPORT した場合はアスキー・モードを選択します。
    IXF をバイナリーで転送しなかった場合、IMPORT が SQL3089N などで失敗します。
  • IXF へのエクスポート時に、変換によって文字の切り捨てが発生する可能性がある場合、警告 SQL3132W が記録されます。ただし、この警告が表示されない障害 IC70409 (V9.5 FP8)、 IC70427 (V9.7 FP4) が報告されています。
  • エクスポート時に MODIFIED BY CODEPAGE によって変換を行った場合、予期しない文字の切り捨てが発生する障害が報告されています。
    EXPORT WITH "MODIFIED BY CODEPAGE" MAY TRUNCATE THE DATA. IT04210 (v9.7fp11), IT05377 (v10.1fp5), IT06572 (v10.5fp7)
    この修正により、予期しない切り捨ては発生しなくなります。このため、従来切り捨てが発生する可能性がある場合でも記録されなかった 警告 SQL3132W が記録されることがあります。
  • SQL3525N CODEPAGE option is incompatible with the LOBSINFILE option during IMPORT
    DB2 V8 は CODEPAGE オプションと LOBSINFILE に互換性がありません。V9 以降で解決されています。
  • IMPORT の MODIFIED BY CODEPAGE オプションは IXF で使えないこと、V8 までは必ず一度アプリケーション・コード・ページに変換されることなどから、使用にあたっては注意が必要です。
    また、EXPORT で MODIFIED BY CODEPAGE 954 を指定すると不正な文字長のデータが出力される障害が報告されています。
    IC77874: INCORRECT EXPORTED DATA LENGTH FOR THE EXPORT COMMAND SPECIFYING MODIFIED BY CODEPAGE=954


お問合せ先
技術的な内容に関して、サービス契約のもと IBM サービス・ラインにお問い合わせください。
IBM サービス・ライン

[{"Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU053","label":"Cloud & Data Platform"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PlRAAU","label":"Codepage"},{"code":"a8m500000008PlGAAU","label":"Data Movement->Export"},{"code":"a8m500000008PlHAAU","label":"Data Movement->Import"}],"ARM Case Number":"","Platform":[{"code":"PF002","label":"AIX"},{"code":"PF010","label":"HP-UX"},{"code":"PF016","label":"Linux"},{"code":"PF027","label":"Solaris"},{"code":"PF033","label":"Windows"}],"Version":"All Version(s)"}]

Document Information

Modified date:
03 March 2021

UID

swg21504151