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; ?>