🫥

Windows SQL ServerでIBM DB2のリンクテーブルを作った時に踏んだ不具合の話

2024/02/06に公開

とてもニッチで、これが早く出てくればもっとニーズがあったかもしれませんが、今となっては不要とも思える話です。いや、不要であってほしい話。ほかに良い方法があれば教えてもらいたいですが、そもそもニッチ過ぎて誰も気にしていないであろうレベルの話

Windows SQL Serverでリンクテーブルを作る

Windows SQL Serverでは、ほかのDBをリンクテーブルとして参照することができます。別のマシンのテーブル、別のDBであってもプロバイダーを入れることでSQL Server上のデータのようにデータを参照することができます。

IBM DB2についても Microsoft OLE DB Provider for DB2をSQL Serverの動いているマシンにインストールすることで参照することができます。プロバイダーをインストールして、以降、参照については、ドキュメントをご参照ください
https://learn.microsoft.com/ja-jp/troubleshoot/developer/host-integration-server/data-integration/creating-linked-server-db2

DB2のリンクサーバーの問題点

これにより、リンクテーブルは設定できて、問題なく参照はできる…と思いきや、参照したデータをよく見るといくつかおかしな点があります。

1. DB2の文字コードの設定によっては、参照できない文字がある

DB2の文字のコードがUnicodeでテーブルが作成されていれば問題は全くないのですが、昔からあるテーブルの場合はそうもいきません。日本語であればIBM漢字を使われていることがあると思います。もともとIBM漢字には降られていない文字(①のような丸数字や、㈲のような文字)にぶち当たるとうまいこと文字コードが変換されずに「・」データが返ってくることとなります。
参考(IBM漢字コード一覧表)

2. 参照できるはずの文字が参照できない

1.だけなら理解ができるのですが、一部の文字ではもともと存在する文字であるにも関わらず参照することができない文字があります。「凜」や「煕」です。「煕」については、名前にあまり使われることがない文字ですが、「凜」については、比較的頻出な漢字です。また、いくつかの漢字に関しては字形が入れ替わるといった現象が散見されます

この現象を深堀していくと、どうやらパターンとしてはJIS83JIS90における変更点のマッピングに問題がありそうだということがわかりました。わかったところで、対応方法は闇の中ですが

ダメだった解消方法

  • リンクテーブルを張るときのDB2側のCCSIDを変更してみる
    • これは全く変化がありませんでした
  • クライアント側(SQL Server側)の文字コードを変更する
    • これは、そもそもテーブルを読み込むことができませんでした

2.参照できるはずの文字が参照できない不具合の原因

Microsoft OLE DBProvider for Db2のインストール先のフォルダの中を探ってみると、にibmkanjiからshift-jisに変換するマップファイルが存在します。このマップファイルをShift-jisで開いてみると漢字の一覧が表示されます。それをIBM漢字コード一覧と比較すると…差分があることが判明しました。先ほど表示されなかった「凜」や「煕」の場祖には「・」が入っていることがわかります。
マップファイルの中身

また、詳細にみていくと、字形が入れ替わっていた「遥」と「遙」が入れ替わっていることなども入れ替わっていることがわかりました。

おそらく解決できる方法

このマップファイルにIBM漢字コード一覧に合わせて「凜」を追加してあげると、編集しSQL Serverを再起動するとその修正内容が反映されて、DB2のユーザーテーブルで正しく表示されることがわかりました。字形の変換についても、おそらくこれを修正していくことで、正しく変換がかかるものと思います。

おわり

IBM kanjiからShift-jisの変換テーブルなんてもはやニッチなマップファイルを今から直してとはMicrosoftには言えませんが、もうこちらで修正をしたものを投げさせてほしいです。もう枯れた技術だとは思いますので、ここだけでもOSS化してあれば…プルリクを投げますので何卒…

Discussion