久しぶりにメモ。
開発環境でPDOからmysqlにつないでデータを入れたりしてたのに
本番サーバに設置した途端にプログラムから入れたデータが文字化けした。
mysql> show variables like 'character_set%'; +--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec)
dbにつないで文字コードの設定をみてみたけど問題なかったので変だなーと。
で、以下のプログラムで確認。
$PDO=NULL;
try {
$PDO=new PDO(
sprintf('mysql:host=%s;dbname=%s','localhost','dbname'),'user','password',
array(
PDO::MYSQL_ATTR_READ_DEFAULT_FILE=>'/etc/my.cnf',
PDO::MYSQL_ATTR_READ_DEFAULT_GROUP=>'client',
PDO::ATTR_EMULATE_PREPARES=>'FALSE'));
$PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
} catch(PDOException $e) {
var_dump($e->getMessage());
}
//$PDO->query("SET NAMES utf8");
$sth=$PDO->prepare("SHOW VARIABLES LIKE 'char%'");
$sth->execute();
while($ins=$sth->fetchObject()){
echo $ins->Variable_name . " | " . $ins->Value . "\n";
}
開発環境での結果…
$ php connect_test.php 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/
本番環境の結果…
$ php connect_test.php 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
コレですね…
どうも開発環境では/etc/my.cnfに[client]に文字コードの
指定があったから上手くいってたけど、本番環境では
/etc/my.cnfに文字コードの設定がちゃんとされていないのが問題
だったみたい。
今回の本番環境は/etc/my.cnfを勝手に触れないので
$PDO->query("SET NAMES utf8");
で対応する。。
いろんな環境で動かすならSET NAMESはちゃんと書いておいたほうが良さそうですね。