院生エンジニアのにっき

  • Change style to Blue
  • Change style to Red
  • Change style to Green
  • Change style to Pink

CakePHPとMySQL、phpMyAdminの挙動   2007-04-16

最近CakePHP1.2系列を使ってるんですが、なかなか使える代物になってきました。

以前1.2系列が出現したときはBakeにバグがあり、途中で止まってしまったため「まだたまだ1.2系はだめだな」と思っていたのですが、今になってまぁ使えるレベルになってきたと言えます。


DBの文字化けについてですが、Webプログラマーではプロジェクトの開始と同時に毎回悩まされることかと思います(僕は必ず毎回悩んでいます・・・)。

  • MySQL5.0
  • Apache1.3
  • PHP5(phpMyAdminを利用)

とまぁ標準的な構成なんですが、CakePHPで登録したデータがphpMyAdminで文字化けする現象に出くわしてしまったので解決法を簡単に書いておきます。




今回はphpMyAdminの文字コードを「utf-unicode-ci」にした際に文字列が文字化けせずに表示されることを目標とします。


  • 設定概要
    • 全体の文字コード

クライアント環境で特別指示されてないのなら極力UTF-8を使うべきです。

SJISやEUCだと、時々魔物に遭遇します。

  • my.ini(デフォルト項目以外での追加項目)
  1. [mysqld]
  2. default-character-set=utf8
  3. init-connect='SET NAMES utf8'
  4. collation-server = utf8_unicode_ci
  5. [mysqldump]
  6. default-character-set = utf8
  7. [mysql]
  8. default-character-set = utf8
  • php.ini
  1. [mbstring]
  2. mbstring.language = Japanese
  3. mbstring.internal_encoding = UTF-8
  4. mbstring.http_input = auto
  5. mbstring.http_output = UTF-8
  6. mbstring.encoding_translation = Off
  7. mbstring.detect_order = auto

まぁ、この程度の設定なら誰でもされているかと思います。

しかし・・・!CakePHPのデフォルトの設定だけではDBに登録された際にはアラビア語かのようにきれいに文字化けされて表示されてしまいます。


なにがいけないのか色々と調べた結果、/app/config/database.phpに存在するDATABASE_CONFIGクラスでした。


一般的な設定では、


  1. var $default = array(
  2.         'driver' => 'mysql',
  3.         'connect' => 'mysql_connect',
  4.         'host' => 'localhost',
  5.         'login' => '***',
  6.         'password' => '****',
  7.         'database' => 'database_name',
  8.         'prefix' => ''
  9. );

となっているかと思いますが、この設定に、

  1.         'encoding' => 'utf8'

と追加してみて下さい。

/cake/libs/model/datasources/dbo/dbo_mysql.phpの110行目付近に書かれているのですが、

  1.         if (isset($config['encoding']) && !empty($config['encoding'])) {
  2.                 $this->setEncoding($config['encoding']);
  3.         }

とあり、DATABASE_CONFIGの値に'encoding'が存在すればDBにエンコーディングを設定しています。

setEncoding関数はSET NAMES character-setをしているだけなのですが、デフォルトの設定だけでは文字コードが指定されないらしく、phpMyAdminでの文字化けにつながっていたそうです。


上記の設定によってphpMyAdmin上では文字化けは解消されたのですが、MySQLのコンソール上では未だに文字化けしてしまいます・・・。「SET NAMES SJIS」をすれば解消されるのですが、勝手にSJISにエンコードされているということなのでしょうか・・・・・。



コメントを書く