環境 PHP 8.2 / MySQL 8.4
PHP製Webアプリで、特定の文字列のINSERTが Incorrect string value で失敗しました。
原因
失敗するのは4バイトのUTF-8文字(絵文字、BMP外の漢字など)を含むケースでした。DBが utf8mb3 で構築されており、3バイトまでしか格納できないためです。MySQL 8.0以降のサーバーデフォルトは utf8mb4 ですが、既存DBは旧設定のまま残っていました。
解決の要点
文字セットは接続・DB・テーブル/カラムの全レイヤーで utf8mb4 に揃えます。ALTER DATABASE は既存テーブルを変換しないため、実データを持つテーブル・カラムの変換が必須です。ここを忘れるとカラムが utf8mb3 のまま残り、再発します。
接続側も utf8mb4 を指定します。照合順序を明示する場合は、8.0以降のデフォルトである utf8mb4_0900_ai_ci をテーブルと揃えておきます。
結論
デフォルト値や推奨設定はバージョンで変わります。ミドルウェアを更新するときは、設定パラメータの見直しもあわせて行いましょう。