2007年1月30日火曜日

MySQL と PHP の文字コード

PHPからMySQLに日本語を入れたら文字化けしてしまった。 データには、"?"が並んでいる。 MySQLは4.1.22。 PHPは、4.4.2。

MyNA Web Site によると、4.0と4.1には大きな違いがあるとのこと。

4.0 までは、キャラクターセットはサーバーだけが設定するものであり、クライアントがサーバーのキャラクターセットに自動的に合せて動作していました。 ところが4.1 になってから、サーバー、クライアントがそれぞれのキャラクターセットで動作するようになりました。

よくわからないけど、以下のコマンドによって、設定の状態を知ることができるらしい。

SHOW VARIABLES LIKE 'char%';

ここで表示される character_set_client と character_set_server が一致していれば、文字化けは起きないとのこと。 表示させてみたら、 character_set_server の値が latin1 になっていた。 おかしいと思って調べたら、インストール後の MySQL Server Instance Config Wizard の設定で、日本語を扱う設定をしていたのを忘れていた。 default character set を設定する画面で、Manual Selected Default Character Set / Collection を選び、Character Set を ujis にした。(ujis とは euc-jp のことらしい。)Windows の環境でも、これで問題はでないのだろうか?

これまで、MySQL Administrator 付属の MySQL Query Browser でデータを挿入しても、日本語が化けるわけだ。。。 付属のツールが何か調子が悪いのかと思って、Execute Query でも試したが文字化けしたので、なぜかと悩んでいた。 ばかみたい。。。(o_ _)o~†

そういえば、CMS系をインストールするときによくみた以下のエラーは、4.1によってパスワードの保存形式が変わったからだそうだ。

Client does not support authentication protocol requested by server;

さて、試しに、MySQL Server Instance Config Wizard で Best Support For Multilingualism に設定してみた。 この場合、PHP から日本語を挿入しようとしたら、以下の文が必要であった。

mysql_query("SET NAMES ujis");

しかし、MySQL Server Instance Config Wizard において、ujis に設定したら、上記の文は必要なかった。なんかややこしい。(+_+)