【5.7.0.4】PDO_MYSQL - PHP5.3.6以前は charset指定 が効かない
【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以降」の方がいいかもしれませんね。
takuro hishikawa
Re: 【5.7.0.4】PDO_MYSQL - PHP5.3.6以前は charset指定 が効かない
これ本家GitHubにissue立ててもらえないだろうか