Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

DB2クライアントの問題だった

"db2 rails"でググるとトップにくる http://db2.jugem.cc/ のsimさんからコメントで助言をもらった。

勘ですが、もし日本語文字列の操作時のみエラーがでるのであれば、おそらくクライアントのコードページを設定されると良いのではないでしょうか。
この場合DB2のクライアントはWEBrickなので、

> set DB2CODEPAGE=1208
> ruby script¥server

という感じでWEBrickを起動してみるとうまくいきませんか?

ばっちり。勘が鋭すぎる。というか、よくこんな数日前から書き殴ってるだけのページを見つけてくださったと思う。

補足のコメントをつけていただいて頭も整理出来た。DB2は何で書き込まれても内部はUTF-8で持つことになる。どんな文字コードで書き込んでも変換されるし、よくよく考えてみれば、間違ったコードで書き込まれても、DB2の信じる通りに変換して格納し、信じる通りに変換して出力していれば、可逆の変換をしているかぎり問題にならない。

今回、何が起こっていたかというと、各々がどういうつもりで動いていたかと言えば

          ブラウザ         <==UTF8==> 
<==UTF8==> Rails           <==UTF8==> 
<==SJIS==> DB2クライアント <==SJIS==>
<==SJIS==> DB2サーバ       <==UTF8==>
<==UTF8==> テーブル

こうなってたわけだ。RailsUTF-8で組み立てたSQLDB2クライアントがS-JISだと思って処理したことがおかしい。でも、UTF-8に対してS-JIS <=> UTF-8変換を描けてしまったとしても、表示させるときにまた同じ変換をするから時々化けるという現象になる。

DB2コマンドラインエディタでINSERTした場合には正しくUTF-8で格納されて、それをRailsで表示するときにはDB2クライアントでS-JIS <=> UTF-8を噛まされてS-JISになり、Railsがcontent-typeをUTF-8だと言って送って来ているが、ブラウザのエンコーディングS-JISにしてやると見えるということになる。

DB2CODEPAGEを設定すると、上のDB2クライアントがUTF-8を素直に食ってくれるようになるということみたい。

それにしても、DB2のクライアントは難しい。DB2 Connect とか、クライアントインスタンスとか、カタログとか、ODBCとか、DLIとか何が何なのかうまく説明できない。毎回、セットアップで悩んで動いた後は忘れちゃうし。そういう意味ではJDBCは楽かもしれないなぁ