ソース自体は EUC-JP で書いたので、DB の中身も EUC-JP で保管するようにして、自前のコード変換関数で Shift_JIS→EUC-JP に変換している。
CREATE TABLE するときにも、ちゃんと DEFAULT CHARSET=ujis 付けてるしね。
なのに、データを登録した後で phpMyAdmin でチェックすると、日本語化け化けやん。
どうも、MySQL ではサーバ側で勝手に文字コードのエンコードをしてしまうので、UTF-8 以外のコードではこういう文字化けが発生してしまうという。
日頃 PostgreSQL ばかり使ってて、いきなり MySQL に来たら絶対ハマっちゃうよなあ、これは。
で、解決方法としては、本来の SQL を投げる前に、
SET NAMES ujis
という SQL を発行すること。
具体的には、
$query =<<EndOfQuery;
SET NAMES ujis
EndOfQuery
$sth = $dbh->prepare($query);
$sth->execute();
としてから、本来の SQL を
$query =<<EndOfQuery;
INSERT
INTO
hogehoge
~本来の SQL~
EndOfQuery
$sth = $dbh->prepare($query);
$sth->execute();
と実行すれば良いと。
なんだかなぁ(^^; テーブル作る時に DEFAULT CHARSET=ujis なんて宣言している意味がなかったな。(^^;
まあ、DB に詳しい偉い人たちが文句を言ってないってことは、この実装も間違いではないんだろうけど、なんだかなあ(^^;
ちなみに、MySQL の設定ファイルや実行時のオプションであれこれする方法もあるようなのだが、今回使用しているのが安いレンタルサーバで、MySQL の設定ファイルは触れない仕様らしいので、毎度 SET NAMES ujis を発行する方法しかないようだ。
とほほ。またも無駄な時間を・・・