Microsoftの 変 換 と IBMの 変 換 のルール ルールの 違 いによる 問 題 とDB DB2での 対 応 1 問 題 DB2 UDBをアクセスするWindows 環 境 でのでは 以 下 のような 問 題 が 起 こる 場 合 がある 文 字 化 け 後 述 の 問 題 1 データはあるのに 検 索 条 件 に 合 致 しない 後 述 の 問 題 2 原 因 同 じ 文 字 が 異 なるでデータベースに 保 管 されることによる 問 題 の 場 合 アプリケーション 実 行 環 境 がSJIS 環 境 でも アプリケーション データは 内 部 的 にに 変 換 される への 変 換 はJVMが 行 うが Windows 環 境 においてはこの 変 換 はMicrosoftのSJIS の 変 換 ルールが 適 用 される MicrosoftのSJIS 変 換 ルールと IBMのSJIS 変 換 ルールでは 若 干 異 なる 点 があるため 文 字 によって 上 記 のような 問 題 が 発 生 する これら 問 題 はだけでなく ODBC V3.51の 対 応 のAPIを 使 用 した アプリケーションでも 同 様 の 現 象 が 発 生 2
問 題 1: 文 字 化 けのケース 問 題 となる 文 字 : ~ - (ダッシュ) ~( 波 ダッシュ) ( 双 柱 ) - (マイナス 記 号 ) ( 破 断 線 ) これらの 文 字 はの 中 でも 非 常 によく 似 た 字 体 のものが 存 在 以 下 はそれらを 表 にしたもの http://www.unicode.org にて 参 照 可 能 な"CODE Chart"より 転 載 U + 2 0 1 5 U + 2 0 1 4 U + F F 5 E U + 3 0 1 C U + 2 2 2 5 U + 2 0 1 6 U + F F 0 D U + 2 2 1 2 U + F F E 4 U + 0 0 A 6 H O R IZ O N T A L B A R E M D A S H F U L L W ID T H T IL D E W A V E D A S H P A R A L L E L T O D O U B L E V E R T IC A L L IN E F U L L W ID T H H Y P H E N - M IN U S M IN U S S IG N F U L L W ID T H B R O K E N B A R B R O K E N B A R (S y n g le B y te ) 3 問 題 1: 文 字 化 けのケース IBMとMicrosoftのSJIS 変 換 ルールの 違 い IBM:JIS 準 拠 で 決 定 Microsoft: 独 自 のルールを 採 用 (UCS-2)からに 変 換 する 場 合 IBM 変 換 では2つの 異 なる ( 例 えば 全 角 ダッシュ に 対 応 するU+2014とU+2015)のもの も 1つのの 全 角 ダッシュの に 変 換 できる ように 対 応 しかし は1 対 1 対 応 になって いるため IBMが 優 先 している U+2014をに 変 換 することがで きない このため Windows 環 境 でJava アプリケーションを 使 用 してDB2 のデータベースにアクセスする 場 合 次 に 紹 介 するように 検 索 時 に 問 題 が 発 生 IBM 変 換 ダッシュ U+2015 U+2014? 0x3F 波 ダッシュ U+FF5E ~ 0x8160 ~ 0x8160 U+301C? 0x3F 双 柱 U+2225 0x8061 0x8061 U+2016? 0x3F マイナス 記 号 U+FF0D - 0x817C - 0x817C U+2212? 0x3F 破 断 線 U+FFE4 0xFA55 0xFA55 0xEEFA 0xEEFA U+00A6 0x7C ( 半 角 ) それぞれの 変 換 ルールで 優 先 している 組 み 合 わせ IBM 変 換 ルールで1 方 向 のみ 対 応 している 組 み 合 わせ ルールで 定 義 されていない 組 み 合 わせ IBM 変 換 ルールで 全 角 文 字 を 半 角 文 字 に 変 換 で1 方 向 のみ 対 応 している 組 み 合 わせ 4
問 題 1: 文 字 化 けのケース 全 角 ダッシュをでのデータベースに INSERT この 場 合 はIBM 変 換 がU+2015からへの 変 換 も 対 応 しているため 問 題 はない Javaアプリ アプリを 使 用 して ( 全 角 ダッシュ)をのデータベース データベースにINSERT ダッシュ JVM U+2015 (MS 優 先 のコード コード) IBM 変 換 JDBC ダッシュ 5 問 題 1: 文 字 化 けのケース 全 角 ダッシュをでのデータベースから 検 索 ではU+2014からへの 変 換 に 対 応 していないため 文 字 化 けが 発 生 Javaアプリ アプリを 使 用 して のデータベース データベースから から ( 全 角 ダッシュ)を 検 索 SJIS? 0x3F JVM U+2014 IBM 変 換 JDBC ダッシュ (IBM 優 先 のコード コード) 6
問 題 2: 同 じ 文 字 が 異 なるコード 問 題 となる 文 字 :ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ のコード ページの 中 の2つのをもつ 文 字 に 関 連 する 問 題 これらの 文 字 はSJISからに 変 換 される 場 合 は 同 じ1つのコー ド ポイントになるが からSJISに 変 換 される 場 合 は 1つのも のを2つのものに 変 換 することはできないため IBM 変 換 と では どちらのを 優 先 するかが 異 なっている 例 の 場 合 はまたはMS932のコード ページでは(NEC 選 定 文 字 )と0xFA58(IBM 選 定 文 字 )の2つがある これらがに 変 換 される 場 合 は IBM 変 換 でも でも 同 じU+3231に 変 換 される その 逆 の 場 合 は2つののうちどちらに 変 換 するかが 異 なり IBM 変 換 の 場 合 は0xFA58に またMS 変 換 の 場 合 はに 変 換 される UCS-22 IBM- 943 UCS-2 IBM 変 換 (MS MS932 932) U+3231 U+3231 0xFA58 通 常 Windows 環 境 でを 入 力 すると NEC 選 定 文 字 の 方 の のの が 優 先 されて 使 用 されるため 次 のような 問 題 が 発 生 それぞれの 変 換 ルールで 優 先 している 組 み 合 わせ UCS-2への 変 換 のみ 対 応 している 組 み 合 わせ 7 問 題 2: 同 じ 文 字 が 異 なるコード Windows 環 境 (DB2CODEPAGEは943)のアプリケーションから のデータベースに 接 続 してという 文 字 をINSERTするケース A. DB2 CLP(コマンド ライン プロセッサ)の 場 合 途 中 でへの 変 換 が 発 生 しない この 場 合 以 下 のようにのはそのままでデータベースに 保 管 される CLPなど など JDBC/ODBCを 介 さないアプリケーション アプリケーションを 使 用 してをINSERTした した 場 合 CLPなど Windows 環 境 でを 入 力 すると のコード ポイントのが 優 先 される この 場 合 はコード 変 換 が 発 生 しないので のまま のままデータベース データベースに 保 管 される 8
問 題 2: 同 じ 文 字 が 異 なるコード B. の 場 合 この 場 合 は 途 中 でに 変 換 される からへの 変 換 の 時 はIBM 変 換 のルールに 従 い IBM 選 定 文 字 の 方 の0xFA58 ののになる アプリケーションを 使 用 してをINSERTした した 場 合 JVM U+3231 IBM 変 換 JDBC 0xFA xfa58 (IBM 優 先 のコード コード) Windows 環 境 でを 入 力 すると のコード ポイントのが 優 先 される この 場 合 は 途 中 でに 変 換 され さらに さらにから からへの 変 換 が 発 生 し 0xFA58のコード ポイントのとして 保 管 される 9 問 題 2: 同 じ 文 字 が 異 なるコード 現 象 のまとめ アプリケーションのコード ページとデータベースのコード ページが 一 致 している 場 合 通 常 は コード 変 換 が 発 生 しないので 入 力 された 文 字 はそのままのコードポイントでデータベースに 保 管 されると 思 われるが JDBCを 介 したことにより 異 なるで 保 管 されてしまう という 現 象 が 発 生 する そのためという 文 字 はINSERTしたアプリケーションの 違 いで データベース 内 では 2つの のものが 存 在 するという 現 象 が 発 生 する このような2つののものが 混 在 する 状 況 ではさらに 同 じという 文 字 をもつ データの 中 に 検 索 条 件 に 合 致 するものとしないものが 発 生 することになる 10
問 題 2: 同 じ 文 字 が 異 なるコード が2つのコードポイントで 保 管 されているデータベースに 対 して COL1= という 条 件 で 検 索 A. DB2 CLP(コマンド ライン プロセッサ)の 場 合 JDBCを 介 して 保 管 されたの 方 は 検 索 結 果 として 返 されない CLPなど など JDBC/ODBCを 介 さないアプリケーション アプリケーションを 使 用 し を 検 索 条 件 に 指 定 してSELECTした した 場 合 CLPなど SELECT * from TAB1 where COL1 = = () COL1 = 0xFA58 Windows 環 境 でを 入 力 すると のコード ポイントのが 優 先 される この 場 合 はコード 変 換 が 発 生 しないので 検 索 条 件 のはとして 比 較 される 条 件 に 合 致 しない 11 問 題 2: 同 じ 文 字 が 異 なるコード B. の 場 合 CLPを 介 して 保 管 されたの 方 は 検 索 結 果 として 返 されない アプリケーションを 使 用 し を 検 索 条 件 に 指 定 してSELECTした した 場 合 SELECT * from TAB1 where COL1 = = () U+3231 IBM 変 換 COL1 = 0xFA58 0xFA58 条 件 に 合 致 しない Windows 環 境 でを 入 力 すると のコード ポイントのが 優 先 される この 場 合 は 途 中 でに 変 換 され さらに さらにから からへの 変 換 が 発 生 し 検 索 条 件 のは0xFA58として 比 較 される 12
SJIS 変 換 での2つの 問 題 に 対 するDB DB2での 対 応 MicrosoftとIBMのSJIS 変 換 のルールの 違 いにより 2つの 問 題 が 潜 在 IBMではこれらの 問 題 に 対 応 するため 新 しくMS 対 応 の 変 換 表 を 提 供 V7ではFixpak9で V8ではFixpak2で 提 供 提 供 される 変 換 表 のファイル 名 V7: 0941ucs2.cnv 0943ucs2.cnv ucs20941.cnv ucs20943.cnv V8: 0943ucs2.cnv ucs20943.cnv 提 供 されているファイルの 種 類 が 異 なるのは V8では0943ucs2.cnvに0941ucs2.cnvの 変 換 部 分 も 含 まれるようになっため ucs20943.cnvとucs20941.cnvも 同 じ 提 供 方 法 と 使 用 方 法 DB2 UDBが 使 用 するコード 変 換 用 の 表 は ファイルとしてDB2の 導 入 ディレクトリーの /SQLLIB/CONVディレクトリーに 存 在 V7のFixpak9 またV8のFixpak2ではその 下 にMSというサブディレクトリーが 作 成 され 新 しい 変 換 表 はこのサブディレクトリーに 存 在 する これを 使 用 する 場 合 は /SQLLIB/CONVディレクトリー 直 下 の 既 存 の 同 じ 名 前 の 変 換 表 と 入 れ 替 える 念 のため 既 存 のファイルはRENAMEするか 別 の 場 所 にバックアップ コピーを 作 成 しておくこと ファイルを 置 き 換 えたあと DB2を 再 スタート なお この 新 しい 変 換 表 の 使 用 に 関 しては 飽 くまでも 利 用 者 の 責 任 において 使 用 すること 13 解 説 : この 変 換 表 は これらの 問 題 に 関 してその 対 応 への 要 望 が 多 いため クライアントとのデータベースの 接 続 とい う 限 られた 環 境 での 使 用 に 対 して ローカルの 対 応 策 としてお 客 様 の 責 任 下 でご 使 用 いただくために 提 供 されたもの あくまでもIBMでは 今 までの 方 針 を 変 えず Windows 環 境 でどうしてもMSに 対 応 したテーブルを 使 用 しなければならず また 既 存 のデータをすべて 新 しいテーブルを 利 用 して 移 行 し 既 存 の 変 換 テーブルの 影 響 を 受 けない 環 境 下 を 作 成 できるということが 保 証 できる 場 合 のみ この 新 しい 変 換 表 を 適 応 していただくという 考 え 方 をとっているということ またどのような 影 響 変 更 があるのか ということを 充 分 理 解 の 上 使 用 すること 変 換 表 の 変 更 にあたっては 影 響 範 囲 を 充 分 調 査 の 上 適 用 すべきサーバーとクライアントは 全 て 同 じ 変 換 表 を 使 用 するように 徹 底 すること なお JDBCアプリケーションの 場 合 は IBM 製 のJDKであればJVMで 使 用 する 変 換 表 をMS932ではなくCp943Cに 変 更 することに より MSのコードではなくIBMのコードに 統 一 することも 可 能 であるの こちらの 方 法 も 要 検 討 14
従 来 (IBM IBMルール ルール)の 変 換 表 とMS 対 応 の 変 換 表 の 違 い 従 来 のIBM IBMルール ルールの 変 換 UCS-2 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ 0x8754 0xFA4A 0x8755 0xFA48 0x8756 0xFA4C 0x8757 0xFA4D 0x8758 0xFA4E 0x8759 0xFA4F 0x875A 0xFA50 0x875B 0xFA51 0x875C 0xFA52 0x875D 0xFA53 0x8782 0xFA59 0x8784 0xFA5A 0xFA58 U+2160 U+2161 U+2162 U+2163 U+2164 U+2165 U+2166 U+2167 U+2168 U+2169 U+2116 U+2121 U+3231 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ ~ - 0x8160 0x8161 0x817C U+2015 U+FF5E U+2225 U+FF0D ~ - U+2014 U+301C U+2016 U+2212?? U+FFE4 0xFA55 U+00A6 0xEEFA 新 しいMS 対 応 のIBM 変 換 UCS-2 Ⅰ 0x8754 0xFA4A U+2160 Ⅰ Ⅱ 0x8755 0xFA48 U+2161 Ⅱ Ⅲ 0x8756 0xFA4C U+2162 Ⅲ Ⅳ 0x8757 0xFA4D U+2163 Ⅳ Ⅴ 0x8758 0xFA4E U+2164 Ⅴ Ⅵ 0x8759 0xFA4F U+2165 Ⅵ Ⅶ 0x875A 0xFA50 U+2166 Ⅶ Ⅷ 0x875B 0xFA51 U+2167 Ⅷ Ⅸ 0x875C 0xFA52 U+2168 Ⅸ Ⅹ 0x875D 0xFA53 U+2169 Ⅹ 0x8782 0xFA59 U+2116 0x8784 0xFA5A U+2121 0xFA58 U+3231 U+2015 U+2014 ~ 0x8160 U+FF5E ~ U+301C? 0x8161 U+2225 U+2016-0x817C U+FF0D - U+2212? U+FFE4 0xFA55 U+00A6 0xEEFA 15 MS 対 応 の 新 しい 変 換 表 を 使 用 すると 問 題 1: 文 字 化 けのケース 文 字 化 けの 発 生 が 解 消 Javaアプリ アプリを 使 用 して のデータベース データベースから から ( 全 角 ダッシュ)を 検 索 SJIS 正 しく 変 換 JVM 新 IBM 変 換 U+2015 JDBC (MS 優 先 のコード コード) ダッシュ 16
MS 対 応 の 新 しい 変 換 表 を 使 用 すると 問 題 2: 同 じ 文 字 が 異 なるで 保 管 されるケース NEC 選 定 文 字 のに 統 一 される アプリケーションを 使 用 してをINSERTした した 場 合 JVM U+3231 新 IBM 変 換 JDBC CLPでINSERTした 時 と 同 じコード (MS 優 先 のコード コード) 17 MS 対 応 の 新 しい 変 換 表 を 使 用 する 場 合 の 注 意 事 項 問 題 1のケースは 検 索 時 の 問 題 であり MS 対 応 の 変 換 表 を 使 用 すれ ば 現 象 はすぐに 解 決 しかし 問 題 2のケースは 既 にデータベースに 保 管 されているデータと の 整 合 性 を 考 慮 する 必 要 がある 即 ちMS 対 応 の 変 換 表 を 使 用 すると は 新 たにで 保 管 されるため 既 存 の0xFA58の データと 混 在 することになる 2つのコードポイントを 統 一 する 必 要 がある 18
2つの つのコード ポイントを 統 一 する 方 法 (V8 以 降 の 場 合 ) EXPORT/LOADを 利 用 対 象 の 表 のデータをDEL 形 式 で に 変 換 してEXPORT 環 境 変 数 のDB2CODEPAGEで1208を 指 定 してEXPORT DB2CODEPAGEを 設 定 する 場 合 db2setでdb2レジストリー 変 数 として 設 定 すると そのインスタンスの 全 てのアプリケーション に 影 響 してしまうので EXPORTを 実 行 するセッションだけで 設 定 できるよう AIXであればexport Windowsであればsetコマンド で 環 境 変 数 として 設 定 する 方 がよい NEC 選 定 文 字 のに 統 一 する 場 合 MS 対 応 の 変 換 表 が 使 用 できる 状 態 で LOADのオプションでMODIFIED BY CODEPAGE=1208を 指 定 して LOADしなおす IBM 選 定 文 字 のに 統 一 する 場 合 MS 対 応 の 変 換 表 ではなく 従 来 から 提 供 されているIBM 変 換 表 を 使 用 し LOADのオプションでMODIFIED BY CODEPAGE=1208を 指 定 してLOADしなおす 注 意 事 項 LOADでなくIMPORTを 使 用 すると (UTF-8)の 状 態 で 表 の 列 の 長 さより 長 いデー タが 欠 落 するので IMPORTは 使 用 しないでください DB2 V7の 場 合 は LOADでcodepageを 指 定 できないので この 方 法 は 使 用 できません 19 2つの つのコード ポイントを 統 一 する 方 法 (V8 以 降 の 場 合 ).. NEC 選 定 文 字 のに 統 一 する 場 合 の 手 順 DB2 UDB データベース サーバー >exportまたはset DB2CODEPAGE=1208 >db2 terminate >db2 connect to sample >db2 EXPORT to uni.del of del select * from TBL_A DB2CODEPAGEの 設 定 は 新 規 の 接 続 から 有 効 になるため 当 例 では db2 terminateを 入 れています uni.del U+3231 U+3231 新 しい 変 換 表 使 用 >db2 connect to sample >db2 LOAD from uni.del of del MODIFIED BY CODEPAGE=1208 replace into TBL_A TBL_A 0xFA58 TBL_A 20
2つの つのコード ポイントを 持 つ 文 字 のその 他 の 問 題 2つののものが 発 生 してしまう 問 題 はと のコード ページ 変 換 に 限 った 問 題 ではなく 以 外 のコード ページからのコード ページへの 変 換 が 発 生 する 場 合 に 共 通 に 起 こりえる 問 題 例 ホスト DB2からデータを 抽 出 し それをのデータベースに 保 管 する 場 合 ホスト コー ドのx'446D'は0xFA58に 変 換 されて 保 管 される このデータベースに 対 してWindows 環 境 のCLPから を 条 件 に 検 索 すると やはり 検 索 条 件 に 合 致 しない しかし 新 しい 変 換 表 が 提 供 されているのは ととの 変 換 だけ ホストのコードページや 以 外 ( 例 えばEUCなど)ととの 間 の 変 換 では まだ 潜 在 している 問 題 といえる この 部 分 に 関 しては 2006 年 にEUC 用 2007 年 にホスト(EBCDIC)コードページ 用 のMS 対 応 変 換 表 が 追 加 されています ホスト(EBCDIC)コードページ 用 のMS 対 応 変 換 に 関 しては DM-07-027 DB2 9&DB2 UDB V8FP#14 編 代 替 変 換 表 の 使 用 に 関 する 最 新 情 報 のテクニカルフラッシュをご 参 照 ください 21