さくらサーバでPHP5.6でMYSQL8.0へ接続できなかったお話

今回は結論から申し上げます。
さくらサーバー(スタンダードプラン)で、PHP5.6からMYSQL8.0への接続は断念しました。
PHP5.6からMYSQL8.0へ接続するには、MYSQL側の設定を変更する必要があるのですが、MYSQLを他の利用者と共有しているレンタルサーバーでは、まず無理ということがわかりました。
占有サーバー等であれば、MYSQLの設定変更は可能ですが、共有サーバーでは他の利用者に影響が発生することから、そもそも編集権限がありません。
なにより、代替案のほうが実現的でした。
なので、私はPHP5.6からMYSQL8.0への接続は断念し、代替案で対処することにしました。
もしかしたら、グレーな方法でなんとかできるのかもしれません。
(ただ、スタンダードプランでPHP5.6からMYSQL8.0へ接続する方法は見つけられませんでした。)
ですが、代替案のほうが無難です。
ということで、今回はPHP5.6からMYSQL8.0へ接続するための体験談です。
PHP5.6からMYSQL8.0へ接続が必要になった経緯
さくらサーバーで、PHP5.6→PHP8.3へバージョンアップをしようと思いました。
そのためには、事前にPHPプログラムをPHP8.3に対応させる必要があります。
PHP8.3へバージョンアップした瞬間に、動かなくなることを防ぐためです。
そこで私は、PHP8.3に対応した最新版のPHPプログラムに乗せ換えることにしました。
その際に、最新版のPHPプログラムは、MYSQLのテーブルフォーマットが異なるため、別のMYSQLを構築する必要がありました。
現在、さくらサーバーのスタンダードプランで、新規でデータベース生成をすると、無条件でMYSQL8.0で生成されます。
以上の経緯より、PHP5.6でMYSQL8.0に接続する必要がでてきました。
実際にPHP5.6からMYSQL8.0へ接続しようとしたらエラーになりました
PHPからMYSQLへの接続は、PHPで標準装備されている関数でおこないます。
MYSQL8.0でも問題ないだろうと安易に考えていました。
実際にPHP5.6からMYSQL8.0で接続を実行してみたところ、以下のエラーが発生しました。
Warning: mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers in
Warning: mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers in
Warning: mysqli_set_charset(): invalid object or resource mysqli in
Warning: mysqli_select_db(): invalid object or resource mysqli in
Warning: mysqli_errno(): invalid object or resource mysqli in
Warning: mysqli_error(): invalid object or resource mysqli in
Warning: mysqli_select_db(): invalid object or resource mysqli in
ワーニングだからと、たかをくくっいたら、本当にMYSQLに接続できていませんでした。
ググって原因を調べると、MYSQLの設定の問題というようなことが出てきました。
そこで、今まで使用していたMYSQL5.7へ接続してみると、問題なく接続できました。
また、PHP8.3の環境でMYSQL8.0へ接続してみると、これも問題なく接続できました。
原因を調べてみたところ、次のような内容でした。
「MYSQL8.0で、接続方法が新しくなったため、対応していない言語のバージョンでは接続できません。」つまり、MYSQL8.0非対応のPHP5.6ではMYSQL8.0へ接続できないことがわかりました。
何とかする方法をググりましたが、レンタルサーバーではむつかしい方法でした。

早速「PHP5.6からMYSQL8.0へ接続する方法」で検索したところ、「MYSQL側の設定を変更すれば良い」という内容がでてきました。
実際、MYSQL側が接続拒否しているため、MYSQL側で接続拒否しないようにすれば解決するのは、自明の理です。
ですが、さくらサーバーのスタンダードは、共有サーバーであるため、my.cnfといったMYSQLの設定をコントロールパネルからは変更できません。
PHPの設定ファイルであるphp.iniは、ある程度コントロールパネルから変更でき、他の利用者に影響しない仕組みになっています。ですが、MYSQLの場合はそうなっていないようでした。
さくらサーバーでも、占有サーバーなど他の利用者に影響の出ないプランであれば、MYSQLの変更はできそうですが、スタンダードプランのような共有サーバーでは、まず無理です。
なので、MYSQLの設定を変更する方法は断念しました。
やはり他の利用者に迷惑をかけてはいけません。
そこで他の方法を模索しました
MYSQLの設定を変更せずに何とかする代案を模索し、以下の方法が有効でした。
- PHPを8.3にバージョンアップする
- MYSQL5.7で代用する
1.のPHPをバージョンアップすれば、そもそも回りくどいことしなくてもMYSQL8.0へ接続できるようになります。実際に、いずれはPHP8.3へバージョンアップするため、最終的な着地てんでもあります。
ですが、複数のサイトがあり、すべてのサイトがPHP8.3で動作する状態にしなければ、PHP8.3へバージョンアップできません。
そのための準備をしている段階なので、この方法はできません。
そこで、2.のMYSQL5.7で代用することにしました。
テーブル名が重複しないようにテーブル名を変更して対応

PHP5.6とMYSQL5.7であれば、問題なく接続できます。
ただ、さくらサーバーでは、MYSQL5.7のデータベースは、新規で追加できなくなっています。
(新規追加すると、無条件でMYSQL8.0で追加されます)
なので、既存のデータベースを利用するしかありません。
その際に問題なのは、テーブル名が重複することです。
同じテーブル名では、新たにテーブル追加できません。
そこで、PHPプログラム側のMYSQLテーブル名を変更して対応することにしました。
テーブル名を変更すれば、既存のテーブル名と重複しなくなります。
これで、無事PHP5.6の環境でPHP8.3にバージョンアップするための下準備ができました。
一気にPHP8.3へバージョンアップできればそれでよい話なのですが

今回は、PHP5.6からMYSQL8.0へ接続しようとしてうまくいかなかった体験でしたが、そもそもの話、最初から一気にPHP8.3へバージョンをあげてしまえば特に問題のない話でした。
それができなかったのは、サイトが多数あるためです。
すべてのサイトがPHP8.3で動作する状態にしてかからないと、PHP8.3にしたとたん、サイトが正しく表示されなくなります。
仕事でサーバー運営をしている場合、それは致命的です。
なので、回りくどいことをしても、サイトが常時表示されている状態をキープしなければいけないのです。
サイトの運営は、想像よりより気を使わねばいけないものなのです。