XOOPSとphpMyAdminに関するMySQLの文字コード

文字化けの嵐でわけのわからないことになりましたが、ようやく解決できたのでメモっときましょう。文字コードまわりは設定すべき個所が多く複雑なので、ネットで調べても同一環境の人に出会える可能性が低く結局自己解決しなければいけないことが多いような気がします。

FedoraCore5
MySQL 5.0.27
phpMyAdmin 2.10.0.2
PHP 5.1.2
XOOPS 2.0.16a JP

とりあえず適当に設定してXOOPSMySQLを入れたところ動くことにはすぐ動きます。しかし、データベースのバックアップやテーブルを直接編集するなどの作業ができたほうが良いと思い、phpMyAdminを入れてみたところ、テーブル内の日本語データが完全に文字化けしてしまったので設定を変更して、データベースを作り直したわけです。


システムに関する文字コード

Fedoraのシステム文字コードutf-8
PHPの内部コード:euc-jp
XOOPSソースの文字コードeuc-jp

基本的にPHPeuc-jpで動かしているので、データベースもeuc-jpにします。MySQLのデータベースに関する設定ファイル/etc/my.cnfを編集して、default-character-setをujis(euc-jp)にします。skip-character-set-client-handshakeを設定に加えるとデータを返す時にクライアントにdefault-character-setの文字コードでデータを返してくれるそうです。

[client]
default-character-set = ujis

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
old_passwords=1
default-character-set = ujis
skip-character-set-client-handshake

[mysql.server]
user=mysql
basedir=/var/lib

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysqldump]
default-character-set = ujis

[mysql]
default-character-set = ujis

設定を変えてからmysqldを再起動してデータベースを作ります。phpMyAdminがインストール済みであれば照合順序をujis-japanese_ci*1にしてデータベースを作ります。作った後にshow variables like 'char%';で文字コードの確認。

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | ujis                       |
| character_set_connection | ujis                       |
| character_set_database   | ujis                       |
| character_set_filesystem | binary                     |
| character_set_results    | ujis                       |
| character_set_server     | ujis                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

これでどうにか動きましたが、MySQLに関してわからないことが多すぎてかなりあてずっぽうな感じです。すべての設定箇所で同じ文字コードにすればなにも問題は起きないんですが、そうできない場合が多々あるのでややこしいんですよね。


これでようやく本題に入れる・・。

*1:utf8-general_ciでも問題ないようですしこの設定項目もよくわからないですね・・