文字コード指定

Windows上でEclipse + Perlの組み合わせでクライアントプログラムを作って、Windows上でMySQLサーバを動かす。この組み合わせで漢字のデータをデータベースに格納しようとしていたんだけど、うまくいかなくて困ったなと思っていた。
Webから取ってくるデータはeuc-jp。クライアントプログラムはPerlランタイム内部ではunicodeソースコード上記述された漢字リテラルsjis。http getしてきたものはdecodeしてからsjis encodeしてから漢字リテラルとの比較とかしていて、ここはOK。で、問題はDBへの格納。
表のデフォルト文字列はsjis。列の指定もsjis。これで入れれば入るんだけど、MySQL Query Browserで見ると文字化け。クライアントから見ると一見とれてるんだよね。で、「まあ、Query Browserが腐っているのかな?」とか思っていたけど、どーも真相は違うということが判明。
MySQLでは、最終的に書き込まれるデータはutf8固定らしい。表や列の定義で決めた文字コードは、そこに一旦変換して取り扱いますよ、ということらしい。で、もうひとつ文字コードを指定するところがあって、「クライアント文字コード」とか言う。表・列で決めた文字コードはサーバ側で持っている時のコード。クライアントにデータをもらった時「クライアントはeuc-jpね」というと、サーバ側の文字コードからeuc-jpに変換してプログラムで受け取れるらしい。今まで作ってきたプログラムではクライアント文字コードの指定なんてしていなくて、デフォルトのラテンになってた。これがおかしいからINSERTがうまくいかないときとかあったのかも・・・

で、クライアント文字列の指定方法。

$dbh->do("SET NAMES sjis") ;

まあ、Shift JISにしたい場合。Eclipse上ではファイルメニューのプロパティに文字コードの指定箇所がある。デフォルトはcp932。今まで作ったソースコードはすべてコレなので、いまさら変えるわけにもいかず、クライアント側はcp932(≒sjis)で行くしかないな。

いやー、久々にこの問題にまじめに取り組んで、一通り理屈がわかったような気がする。すっきり。