以下はvagrant等のローカル検証での利用を想定しています。
以下はPDOの内部で動くlibmysqlclient.soがlaten1として認識している文字コードを、サーバに合わせてutf8に変換するもので、SQLインジェクションの危険が増すよろしくない設定です。
状況
データベース/テーブル/MySQL設定ファイルで文字コードを正しく設定していてもPDO接続時のみマルチバイト文字が文字化けします。
mysql
mysql> show variables like "%character%";
+--------------------------+----------------------------+
| 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 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
PDO接続時
// PDO接続(PHP 5.3.6以降だとcharsetが使えます
$dsn="mysql:dbname=%s;host=%s;charset=utf8";
/**
略
*/
character_set_client | latin1 <--
character_set_connection | latin1 <--
character_set_database | utf8
character_set_filesystem | binary
character_set_results | latin1 <--
character_set_server | utf8
character_set_system | utf8
character_sets_dir | /usr/share/mysql/charsets/
対策
対策として、MySQLの設定ファイルに以下を記述します。
/etc/my.cnf
# [client]を入力するとなぜか起動しなくなる為
# [mysqld]セクションに以下を追記
character-set-server = utf8
skip-character-set-client-handshake
参考情報)環境について
- CentOS6.5
- MySQLは MySQL公式yumリポジトリ( http://dev.mysql.com/downloads/repo/ ) から新規にインストール
- php5.4等はyumのremiリポジトリから新規インストール
- pdo_mysqlは1.0.2を使用