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が自動的で適切に変換する設定のため文字化けしていなかった。
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。