IBM Support

[Db2] 不適切な代替 Unicode 変換表の使用による不正な照会結果およびデータ破壊

Troubleshooting


Problem

代替 Unicode 変換表の不適切な使用によって、意図しない照会結果が返ったり、意図しないデータ更新によってデータが破壊されることがあります。

Symptom

代替 Unicode 変換表を正しく使用しない場合、以下のような様々な症状が発生する可能性があります。
  • 照会に意図した行が返されない
  • クライアントによって返される行の数が異なる
  • 更新したはずの行が更新されない、または意図しない行が更新される
以下に IBM-943 (シフトJIS) データベースへ、代替 Unicode 変換表を不適切に実装した場合の典型的な現象を例示します。
a) 代替 Unicode 変換表の実装後に、既存のデータを新しいルールに変換していない場合、同じ字形が異なるコード・ポイントに格納されます。
たとえば (株) はデフォルトでは 0xFA58 として格納されますが、代替 Unicode 変換表を使うと 0x878A に格納されます。
以下の例は C1=[1,2] は代替 Unicode 変換表の実装前に格納されたデータ、C1=3 は代替 Unicode 変換表の実装後に格納されたデータです。
$ db2 "select C1,C2,hex(C2) from T1

C1          C2                   3
----------- -------------------- ----------------------------------------
          1 ㈱IBM                FA5849424D
          2 ㈱IBM                FA5849424D
          3 ㈱IBM                878A49424D

  3 レコードが選択されました。
b) この状態で代替 Unicode 変換表を使用したクライアントからの照会と、代替 Unicode 変換表を使用していないクライアントからの照会は異なる結果を返します。
代替 Unicode 変換表を使用した場合
$ db2 "select * from T1 where C2 = '㈱IBM'"

C1          C2
----------- --------------------
          3 ㈱IBM

  1 レコードが選択されました。
代替 Unicode 変換表を使用していない場合
$ db2 "select * from T1 where C2 = '㈱IBM'"

C1          C2
----------- --------------------
          1 ㈱IBM                
          2 ㈱IBM                

  2 レコードが選択されました。

c) 上の例で C2 を述部に更新や削除を行うと、該当の述部は一部の行にのみ適用されるため、データの整合性が失われる可能性があります。
 

Cause

代替 Unicode 変換表を実装する場合、以下の条件を遵守する必要があります。
以下の条件を守らない場合、意図しない照会結果やデータ破壊が発生する可能性があります。
  • 該当データベースにアクセスする「すべての」アプリケーションが代替変換表を使用する
  • サーバーおよびクライアント双方で同じ変換表を使用する。一般的に Db2 のコード変換は受信側で行われます。このため、送信側と受信側で異なる変換ルールを使用した場合の結果は不定です。
  • データベースに格納済みのデータを代替 Unicode 変換表が使用するコード・ポイントに置き換える

Environment

代替 Unicode 変換表を使用したシステム
なお、代替 Unicode 変換表は以下のいずれかの方法で実装できます。
  • Non-Java クライアントとの変換
    以下のページに示されているように、Db2 クライアントおよびサーバーの sqllib/conv 以下に代替 Unicode 変換表を配置してアプリケーションや Db2 インスタンスを再始動します。
    CCSID 943 の代替 Unicode 変換表
    CCSID 5026 および CCSID 1390 の代替 Unicode 変換表
  • Java クライアントとの変換
    Jcc ドライバーの構成プロパティ db2.jcc.ccsid<ccsid>Mapping を 2 に設定し、Java アプリケーションを再始動します。
    例:IBM-943 データベースへ接続する JDBC アプリケーションで代替 Unicode 変換表を使用
    java -cp [path_to_class_for_appl] -Ddb2.jcc.ccsid943Mapping=2 [application_class_name]

Resolving The Problem

代替 Unicode 変換表を使用する場合以下の 2 点を遵守する必要があります。
 
  • 該当データベースにアクセスする「すべての」クライアントおよびアプリケーションで代替 Unicode 変換表を使用する
  • 代替 Unicode 変換表を使用する場合、データベースの既存のデータを代替 Unicode 変換表が使用するコード・ポイントに変換する。たとえば代替 Unicode 変換表を実装した Unicode クライアントから既存の表データを EXPORT し、そのデータを使って LOAD REPLACE することで新しいコード・ポイントに変換可能です。
    1. 異なるコード・ポイントが混在しています。
      
      $ db2 "select C1,C2,hex(C2) from T1
      
      C1          C2                   3
      ----------- -------------------- ----------------------------------------
                1 ㈱IBM                FA5849424D
                2 ㈱IBM                FA5849424D
                3 ㈱IBM                878A49424D
      
        3 レコードが選択されました。
      
    2. 代替 Unicode 変換表を実装済みの Unicode クライアントから EXPORT と LOAD を行います。
      
      $ export DB2CODEPAGE=1208
      $ db2 terminate
      $ db2 connect to <db_name>
      $ db2 "export to T1.ixf of ixf select * from T1"
      $ db2 "load from T1.ixf of ixf replace into T1"
      $ db2 "select C1,C2,hex(C2) from T1
      
      C1          C2                   3
      ----------- -------------------- ----------------------------------------
                1 ㈱IBM                878A49424D
                2 ㈱IBM                878A49424D
                3 ㈱IBM                878A49424D
      
        3 レコードが選択されました。
      
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

Document Location

Worldwide

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PlRAAU","label":"Codepage"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
15 August 2023

UID

ibm16502729