MySQLでCakePHPを運営するさいの文字コード関連

Pocket

MySQLを使いCakePHPを運用するさいの文字コードのメモ。

問題

データベースへ保存したデータをブラウザ表示したときは文字化けしないがmysqlクライアントのSELECT文実行やmysqldumpのダンプファイルで文字化けが発生していた。

クライアント 文字化け
mysql する
dump する
ブラウザ表示 しない

データベース情報

MySQLの文字関連は以下になるように設定していた。

mysql> SHOW VARIABLES LIKE 'char%';
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8

データベース、テーブル文字コード確認

データベース、テーブルの文字コードはともにUTF8で作成していた。

mysql> SHOW CREATE DATABASE <database name>;
Database Create Database
example CREATE DATABASE example /*!40100 DEFAULT CHARACTER SET utf8 */
mysql> SHOW CREATE TABLE <table name>;

.....
DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

解決

CakePHPのConfig/database.phpのデータベース接続定義でencodingを指定していなかった。
encodingでutf8を指定すると文字化けは解消された。

class DATABASE_CONFIG {

    public $default = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => '127.0.0.1',
        'login' => 'example',
        'password' => 'passw0rd',
        'database' => 'example',
        'prefix' => '',
        'encoding' => 'utf8',       // この記載を追加したら文字化けせず保存できるようになった。
    );

    public $test = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => '127.0.0.1',
        'login' => 'example',
        'password' => 'passw0rd',
        'database' => 'example_test',
        'prefix' => '',
        'encoding' => 'utf8',      // この記載を追加したら文字化けせず保存できるようになった。
    );
}

疑問

mysqlクライアントでSET NAMES Latin1を実行したあとSELECT文を実行すれば文字化けは解消されmsyqldumpも下記のように latin1でダンプしたファイルは文字化けしていなかった。

$ mysqldump --default-character-set=utf8 -u example -p example > dump.sql   // 文字化けする
$ mysqldump --default-character-set=latin1 -u example -p example > dump.sql // 文字化けせずにダンプ

latin1のデータがデータベースにはUTF8として保存されるのでmysqlクライアントやmysqldumpでは文字化けするがブラウザ表示はPHPが自動的で適切に変換する設定のため文字化けしていなかった。

仙石浩明の日記: 文字化けしていなくても MySQL 内の文字コードが正しくない場合がある

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。