PHPからMySQLに4バイト文字を保存できない問題

環境 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 をテーブルと揃えておきます。

結論

デフォルト値や推奨設定はバージョンで変わります。ミドルウェアを更新するときは、設定パラメータの見直しもあわせて行いましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください