Troubleshooting
Problem
代替 Unicode 変換表の不適切な使用によって、意図しない照会結果が返ったり、意図しないデータ更新によってデータが破壊されることがあります。
Symptom
代替 Unicode 変換表を正しく使用しない場合、以下のような様々な症状が発生する可能性があります。
- 照会に意図した行が返されない
- クライアントによって返される行の数が異なる
- 更新したはずの行が更新されない、または意図しない行が更新される
以下に IBM-943 (シフトJIS) データベースへ、代替 Unicode 変換表を不適切に実装した場合の典型的な現象を例示します。
a) 代替 Unicode 変換表の実装後に、既存のデータを新しいルールに変換していない場合、同じ字形が異なるコード・ポイントに格納されます。
たとえば (株) はデフォルトでは 0xFA58 として格納されますが、代替 Unicode 変換表を使うと 0x878A に格納されます。
以下の例は C1=[1,2] は代替 Unicode 変換表の実装前に格納されたデータ、C1=3 は代替 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 することで新しいコード・ポイントに変換可能です。
例- 異なるコード・ポイントが混在しています。
$ db2 "select C1,C2,hex(C2) from T1 C1 C2 3 ----------- -------------------- ---------------------------------------- 1 ㈱IBM FA5849424D 2 ㈱IBM FA5849424D 3 ㈱IBM 878A49424D 3 レコードが選択されました。
- 代替 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 レコードが選択されました。
- 異なるコード・ポイントが混在しています。
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"}]
Was this topic helpful?
Document Information
Modified date:
15 August 2023
UID
ibm16502729