ショコラ
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 に接続する手順。
- ドッカーファイルを作成します。
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
- ドッカーファイルをビルドします。
docker build . -t mysql8
- MySQL8utf8版のコンテナを立ち上げます。
docker run --name=mysql8 --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql8
- 別のターミナルを立ち上げて、キャラセットを確認してみます。
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/ |
+--------------------------+--------------------------------+
- PHP5.6コンテナを立ち上げます。
docker run --rm -it php:5.6 bash
- pdo_mysql をインストールします。
docker-php-ext-install pdo_mysql
- 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