【5.7.0.4】PDO_MYSQL - PHP5.3.6以前は charset指定 が効かない

2014年10月17日 at 14:15

【5.7.0.4】PDO_MYSQL - PHP5.3.6以前は charset指定 が効かない
------------------------

PHPのバージョンの問題だったのですが、
だいぶはまってしまったので共有させていただきます。

==================
<インストール先サーバ>
==================
PHP:5.3.5
MySQL :5.1.47
※concrete5 は、composerは使用しないで、サイトからの標準のインストールです。

==================
<現象>
==================
5.7 をインストールし、コンテンツを投入していったのですが、
MySQLの実データを確認してみると、charaset指定している「UTF-8」で入っておらず
「latin1」にエンコードされていました。
※「サイト上の表示は、文字化け無く表示されていた」ので気づかなかったのですが、
 単にUTF-8にデコードされていたただけっぽいです。


==================
<問題点>
==================
▼pdo-mysql
http://php.net/manual/ja/ref.pdo-mysql.connection.phpcharset

charasetの句ですが、
------------------------------------
「PHP 5.3.6 より前のバージョンでは、この要素は黙って無視されていました。
同じ挙動は、ドライバのオプション PDO::MYSQL_ATTR_INIT_COMMAND を使って部分的に複製できます。」
------
となっており、config/database.php に指定している charset は、 PHP5.3.6以前では認識されない模様です。


==================
<対処(暫定)>
==================
【■インストール前■】
ファイル:concrete/config/database.php

driverOptions部分を追加
------------------------
<略>
/**
* The database charset
*/
'charset' => 'utf8',
'driverOptions' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
)
<略>
------------------------

【■インストール後■】
ファイル:application/config/database.php

生成されたdatabase.php にdriverOptionsを追記
------------------------
<略>
'charset' => 'utf8',
'driverOptions' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
)
<略>
------------------------

SET NAMES が毎回通ってしまうので、あまりよろしくない方法かも知れませんが、
これで正常にMySQL Clientが「UTF-8」でデータを扱うようになりました。
==================

5.7.x は、 「PHP5.3.3 以降」がシステム要件っぽいですが、
PDO_MYSQLを使っている以上、「PHP5.3.6以降」の方がいいかもしれませんね。

タグ:

Re: 【5.7.0.4】PDO_MYSQL - PHP5.3.6以前は charset指定 が効かない

2014年10月30日 at 16:40
@Katzさん

これ本家GitHubにissue立ててもらえないだろうか