PHP&MySQL authentication method unknown エラー、libmysqlclientならどうだ
PHP&MySQL authentication method unknown エラー、libmysqlclientならどうだ
2024-08-26
(1).何がしたかったか
- 古いPHP(PHP-5.6, PHP-7.0)で、MySQL 8に接続
- MySQLサーバー側の設定はいじらない
- 以下のエラーを回避
The server requested authentication method unknown to the client [caching_sha2_password]
- PHP付属の
mysqlnd
がだめなら、libmysqlclient
をリンクしたらどうなる? - ちょっとした興味本位で実験
(2).結論
- できた。
- ただし、
pdo_mysql
とmysqli
で少し違った
- ただし、
(3).環境
- Ubuntu 22.04
- PHP 5.6.40, 7.0.13
- MySQL 8.4.2, 5.7.44
(4).経緯
むかーし、昔。あるところにPHP 5.6,7.0のサービスがありましたとさ。裏方さんをMySQL server 8.0に変えたら、ひやぁーーー、とエンジニアが泣いたとさ。
今はPHPmysqlnd
がとっくに対応し、問題ない。(サポートの問題あるため、新しいPHPを使おうね)。
あのとき、MySQL server側でmysql_native_password
にしてしまえという方法があった。
いまさらながらふと思った。
libmysqlclient
ならどう動いたのだろう?多分接続できるのではないか?
ただの興味本位でためす。
(5).pdo_mysql
PHP 5.6,7.0のpdo_mysql
はMySQL 8.4.2のlibmysqlclient
で予想通り問題なくうごいた。やっぱりね。
一部コンパイルエラーが出たが、微調整でおわり。
PHP 5.6,7.0本体全部をコンパイル or phpize
でpdo_mysql
だけコンパイル。
どちらにせよ、./configure
にMySQL 8をあたえればOK
./configure --with-pdo-mysql=shared,/usr/local/mysql-8.4
PHP 5.6,7.0ソース修正(ext/pdo_mysql/php_pdo_mysql_int.h
)
@@ -30,6 +30,9 @@
#else
# include <mysql.h>
# define PDO_MYSQL_PARAM_BIND MYSQL_BIND
+# if !defined(my_bool)
+ typedef char my_bool; /* Small bool */
+# endif
#endif
#if (MYSQL_VERSION_ID >= 40113 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50007 || defined(MYSQL_USE_MYSQLND)
(6).mysqli
PHP 5.6,7.0のmysqli
+MySQL 8との合わせ技、コンパイル無理でしたわ〜。
PHPのソースをかなり変更せねばならないみたいで、やる気なくす。
MySQL 8のinclude/
のファイルが、圧倒的に少ない。MySQL 5.7から8の間で何があった!?
ならば。
MySQL-5.7.44ならどうだ?
MySQL-5.7.44のlibmysqlclient
って、caching_sha2_password
対応してたっけ?
⇒やってみたら、対応してた
PHP 5.6,7.0本体全部をコンパイル or phpize
でmysqli
だけコンパイル。
どちらにせよ、./configure
にMySQL 5.7.44をあたえればOK
./configure --with-mysqli=shared,/usr/local/mysql-5.7.44/bin/mysql_config
MySQLのChangesみていたら、MySQL 5.7.23からcaching_sha2_password
サポートらしい。
以上、いまさら感満載のボソッとでした。
Discussion