MySQL: PHP から認証できない場合


PHP で MySQL に接続しようとすると、 次のようなエラーが出ることがあります。

環境

MySQL の バージョン 8 からこのようなエラーが出るようになりました。 私がこのエラーを出した MySQL のバージョンは、 8.0.11 でした。

  • macOS High Sierra version 10.13.6
  • MySQL 8.0.11 Homebrew

MySQL 8 からの 2種類の認証プラグイン

MySQL 8 から、 2種類の認証プラグインが使えます。

mysql_native_password
従来からあった認証プラグインです。
caching_sha2_password
MySQL version 8 から導入された新しい認証プラグインです。

caching_sha2_password は、 安全なパスワードの暗号化、 キャッシュを用いた認証処理のパフォーマンスの向上等のメリットが多いそうで、 MySQL 8 ではデフォルトで caching_sha2_password が使われるようになっています。

しかし、 PHP で新しい接続プラグインがサポートされていないので(いずれサポートされるとは思いますが)、 caching_sha2_password で管理されているパスワードを使って接続しようとするとエラーが出ます。

PHP で接続できない場合の解決策

どの認証プラグインを使うかはユーザごとの設定です。 次のようにして、ユーザごとの設定を確認できます。

そのため既存のユーザで接続できるようにする場合は、既存ユーザの設定を変更する必要があります。 新しく mysql_native_password を使うユーザを作成して、そのユーザを使って接続することもできます。

既存ユーザの認証プラグインを変更する

次の SQL を実行します。

mysql_native_password を利用する新しいユーザを作る

次のようにして、 mysql_native_password を使うユーザを作成します。

サーバのデフォルト設定を変える

新しいユーザを作成する場合、 認証プラグインを指定する必要があり、 デフォルトでは caching_sha2_password が設定されます。 これを、デフォルトで mysql_native_password を利用するよう設定すれば、 認証方式を指定せずにユーザを作成しても mysql_native_pasword が使われます。

my.cnf に次のように記述し、 サーバを再起動します。