PHP5.4以降に上げたらPDO_MySQLでエラー

2015年1月9日

PHP5.4以降では、MySQLドライバがmysqlndがデフォルトになるために起きるエラーで、

mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. 

等のように表示されます。

PHPをコンパイルするなどして入れた場合、libmysqlclientにドライバを戻すこともできるのですが、今後を考えると使いたくないので、そのままどうにかしたいところです。

このエラーが起きた時、my.cnfにold_password=1が記述されていた場合、mysqlndでは41バイト以上のパスワードハッシュが必要というのが原因です。
そこでその対処法です。

MySQLのパスワードを設定するときに、
SELECT PASSWORD('mypass');
+--------------------+
| PASSWORD('mypass') |
+--------------------+
| 6f8c114b58f2ce9e |
+--------------------+

ですが、そこでこのセッションのみold_passwordsの設定を変えてやると
SET SESSION old_passwords=0;
Query OK, 0 rows affected (0.00 sec)

SELECT PASSWORD('mypass');
+-------------------------------------------+
| PASSWORD('mypass') |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+

となります。
これを使ってユーザーにパスワードを設定すればold_password=1の環境でもmysqlndから普通にログインできます。