PHP5 から MySQL8 に接続できない

ショコラ
ショコラ

PHP5 から MySQL8 に接続できない

PHP7 だと普通に MySQL8 に接続できるのですが、PHP5 から MySQL8 に接続しようとすると失敗してしまいます。
原因は2つあって①MySQL8 からキャラセットに utf8mb4 が使われるようになったこと②認証方式が変わったのことです。
対応方法としては「PHP5 でも接続できる MySQL8 のコンテナを作成する」でキメマス。

もっさん先輩
もっさん先輩

PHP5 から接続できるようにする MySQL の設定ファイル

[mysqld]
character-set-server=utf8mb3
default_authentication_plugin=mysql_native_password
collation-server=utf8mb3_general_ci
[client]
default-character-set=utf8mb3

手順

PHP5 から MySQL8 に接続する手順。

  1. ドッカーファイルを作成します。
FROM mysql:8
RUN \
{\
  echo '[mysqld]';\
  echo 'character-set-server=utf8mb3';\
  echo 'default_authentication_plugin=mysql_native_password';\
  echo 'collation-server=utf8mb3_general_ci';\
  echo '[client]';\
  echo 'default-character-set=utf8mb3';\
} > /etc/mysql/conf.d/php5.cnf
  1. ドッカーファイルをビルドします。
docker build . -t mysql8
  1. MySQL8utf8版のコンテナを立ち上げます。
docker run --name=mysql8 --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql8
  1. 別のターミナルを立ち上げて、キャラセットを確認してみます。
docker exec -it mysql8 mysql -p123456 -e "show variables like 'char%'";

↓キャラセットが utf8mb3 になっています。

$ docker exec -it mysql8 mysql -p123456 -e "show variables like 'char%'";
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb3                        |
| character_set_connection | utf8mb3                        |
| character_set_database   | utf8mb3                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb3                        |
| character_set_server     | utf8mb3                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
  1. PHP5.6コンテナを立ち上げます。
docker run --rm -it php:5.6 bash
  1. pdo_mysql をインストールします。
docker-php-ext-install pdo_mysql
  1. PHP で MySQL に接続します。
php -r  "new PDO('mysql:dbname=mysql;host={ホスト};port=3306','root','123456');

何も表示されなければ接続成功です。

以上

シチュエーション

PHP5 から MySQL8 に接続すると失敗してしまいます。

# php -r  "new PDO('mysql:dbname=mysql;host=mysql;port=3306','root','123456');"

Warning: PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password] in Command line code on line 1

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client' in Command line code:1
Stack trace:
#0 Command line code(1): PDO->__construct('mysql:dbname=my...', 'root', '123456')
#1 {main}
  thrown in Command line code on line 1
Scroll to Top