WordPressをローカル環境でインストールしたところ文字化けが発生。インストールのときに文字コードをUTF-8、EUC-JPのどちらに設定設定も文字化けが発生しました。(S-JISは未確認)

なぜだろうと思いいろいろ調べてみたところデータベース(DB)のMySQL側に問題があるようでした。今回WordPressをインストールしたローカル環境のMySQLはyumでインストールしたのですが、yum(パッケージ)でインストールを行うとMySQLのキャラクタセットがlatin1に強制的に設定されてしまうようです。この為、INSERTする時に文字化けが発生してしまいました。キャラクタセットを変更するには通常はmy.cnfを

[mysqld]
default-character-set=ujis

[client]
default-character-set=ujis

[mysql]
default-character-set=ujis

[mysqldump]
default-character-set=ujis

で設定できます(上記内容はEUC-JPに設定する場合)。
設定を確認するにはコマンドラインでstatusを実行すれば

mysql> status;
--------------
:
(省略)
:
Server characterset:    ujis
Db     characterset:    ujis
Client characterset:    ujis
Conn.  characterset:    ujis
:
(省略)
:
--------------

と表示されてEUC-JPに設定されたことが確認できます。

しかし、MyNaの「mysql コマンドでは大丈夫なのに、PHP,perl,accessなどで文字が ? に化けるのは?(文字化け)」によると、my.cnfを設定してもWordPress(PHP)からINSERTする時にはmy.cnfを無視してINSERTしてしまうようです。実際に試してみても文字化けしてしまいました。my.cnfを無視してしまうようではどうしようもないのでSQLで

SET NAMES ujis;

としてINSERT時にキャラクタセットを指定する方法を行います。この方法を利用するにはWordPressのプログラムを変更する必要があります。変更箇所はwp-includes/wp-db.phpファイルの58行目で


 function wpdb($dbuser, $dbpassword, $dbname, $dbhost) {
    :
   (省略)
    :
   $this->select($dbname);
  if(!mysql_query("SET NAMES ujis;"))
   die('Error by Set Names.'); // ここを追加
 }

と一行追加すれば解消します。

ちなみに今回の環境は以下の通りです。

WordPress:ME 2.0.2
MySQL:4.1.12
PHP:4.3.9

ところで、なぜ、WordPressにはSET NAMESの指定がないのでしょうかね?あってもいいような気がしますが・・・。