🌞

PHP&MySQL authentication method unknown エラー、libmysqlclientならどうだ

2024/08/26に公開

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_mysqlmysqliで少し違った

(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 phpizepdo_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 phpizemysqliだけコンパイル。
どちらにせよ、./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