動かざることバグの如し

殿、温めておいたバグがこちらでございます

PHP + utf8mb4のMySQLにDB接続ができないとき

環境

MySQLに接続できない

PHPからPDO経由でMySQLへ接続しようとしてもうまくいかない。

PDOException: SQLSTATE[HY000] [102] Can't initialize character set utf8mb4 (path: /usr/share/mysql/charsets/) in ****

utf8のDBには正しく接続されるので文字コードが問題っぽいところまではわかったが、そのサーバーからMySQLのコマンド経由だと普通にログインもできるし表示でもできる。むむむ

解決策

どうやらPHPからMySQLに接続するライブラリを変えなきゃいけないらしく、MySQL Native Driverってやつに変えたらいけた

まずは既存のライブラリをアンインストール

yum remove php71w-mysql

MySQL Native Driverのライブラリをインストール

yum install php71w-mysqlnd

service php-fpm restart してphp -mにいればおk

違いは?

今まではlibmysqlclient(MySQL クライアントサーバーライブラリ)が主流だったが、実はPHP 5.3以降はmysqlnd(MySQL ネイティブドライバ)も組み込まれており、今はmysqlndのほうがオススメっぽい。まぁ今時utf8mb4ですし

詳細な比較は公式ドキュメントを参照

http://php.net/manual/ja/mysqlinfo.library.choosing.phpphp.net

参考リンク