MySQL4.1.xで日本語が文字化け
MySQLは、バージョン4.1以降でサブクエリが使えるようになり、随分使い勝手がよくなった。しかし4.1以降で日本語がうまくハンドリングできなくなる。理由はこのバージョンから文字コードの自動変換機能がついたことらしい。
開発で遭遇した問題点と対応した記録をここに掲載する(CentOS4にて)。
【問題】
○CentOS4を日本語環境としてインストール
/etc/my.cnfをネット上の情報に基づき変更するもうまくいかず。
【対応】
○CentOS4を英語環境としてインストール
/etc/my.cnfを上記同様に設定(設定内容は以下:赤字を加筆)。
——————————————————————
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set=ujis
init-connect=SET NAMES binary
[mysql.server]
user=mysql
basedir=/var/lib
default-character-set=ujis
[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set=binary
[mysql]
default-character-set=binary
これでうまくいくと信じ込んでいた。
phpMyAdminを使用して日本語を入力して表示も正常にできた。
いざPHPでプログラムを実行してみるとやっぱりうまくいかない(日本語が文字化けする)。
結局しょうがないので、データベースに接続するphpのコードの直後にクエリを実行させることにした。
SET NAMES binary
しっくりこないんだけど、これでとりあえず解決。
2006/03/24 at 12:34 AM
phpMyAdmin は、MySQL のバージョンが 4.1 以上の場合に、指定された言語&エンコーディングに従って、内部で SET NAMES, SET CHARACTER SET を呼んでいるようです。ソースを SET NAMES で検索してみると出てきますよ。
2006/03/24 at 1:39 PM
コメントありがとうございます。
これって結局my.cnfを設定するだけではダメで、SET NAMESしないとだめなのでしょうか・・・。
2006/04/04 at 1:01 PM
さらに、
[client]
default-character-set=binary
では?
2006/04/05 at 8:14 AM
———————————
[client]
default-character-set=binary
———————————
これいれてもダメですね。
2006/05/18 at 7:50 PM
phpのmbstring.http_outputとmbstring.internal_encodingをUTF-8に設定すれば、問題が解決できます。
2006/05/20 at 5:36 PM
PHPの設定って、何に対してのお話で?。PHP全般?、それともphpMyAdmin?。