DBデータをUTF-8に統一するための設定
CakePHPデフォルトのデータベース設定(database.php)では、サーバ環境によってはデータがUTF-8で保存されない場合があります。
文字化けや、VARCHAR文字数上限のエラーに繋がるので、CakePHP側で「DBにUTF-8で保存する」ための設定を追加して置く方が良いです。
気付いたきっかけは、名称の保存。
日本語入力OKで、VARCHAR(64)にしているのに、実際は22文字くらいまでしか登録できない。しかも最後の文字が文字化けしています。
調べてみると、DBのデフォルト文字コードがlatin1、これで登録されているのが原因のようです。
mysql> SHOW VARIABLES LIKE 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+
my.confを設定して、DBサーバの設定自体を変える方法もありますが、作ってる物が公開配布目標なので、「my.conf設定してください」とお願いするのもイマイチ。
ということで、ソース側で対応する事にしました。
対策参考サイト
XAMPP MySQL (& cakePHP) 文字化け対策: PHPを使ったWebサイト構築 備忘録
キーは、database.phpに'encoding'設定を追加する事です。
bakeで作った分は、以下の改修で対応できないので、インストール手順を工夫することになりそうです。
差分
--- a/app/config/database.php.default +++ b/app/config/database.php.default @@ -84,6 +84,7 @@ class DATABASE_CONFIG { 'host' => 'localhost', 'login' => 'user', 'password' => 'password', + 'encoding' => 'utf8', 'database' => 'database_name', 'prefix' => '', ); @@ -94,6 +95,7 @@ class DATABASE_CONFIG { 'host' => 'localhost', 'login' => 'user', 'password' => 'password', + 'encoding' => 'utf8', 'database' => 'test_database_name', 'prefix' => '', ); diff --git a/app/views/layouts/admin_default.ctp b/app/views/layouts/admin_default.ctp index e3f452c..7b4a24f 100644 --- a/app/views/layouts/default.ctp +++ b/app/views/layouts/default.ctp @@ -12,7 +12,7 @@ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xh <html xmlns="http://www.w3.org/1999/xhtml"> <head> -<?php echo $html->charset(); ?> +<?php echo $html->charset('utf-8'); ?> <meta http-equiv="X-UA-Compatible" content="IE=7"> <title> <?php echo $title_for_layout; ?>