LoginSignup
8
7

More than 5 years have passed since last update.

Cent6.5 + MySQL5.6 + PHP5.4(PDO接続)でマルチバイトの文字化けに対応

Last updated at Posted at 2014-07-24

以下は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を使用
8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7