mysql:utf8mb4
utf8mb
utf8mb4にアップグレード
文字列カラムのcharsetをutf8(utf8mb3)からutf8mb4に変換する手順
DBのdefault charsetを変更
ALTER DATABASE <db_name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci;
テーブルのdefault charsetを変更
ALTER TABLE <table_name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci;
テーブルの文字列データを変換(データ量で所要時間が変化するのでテスト環境を用意してサービスに影響しないかチェックすること)
ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
テーブルの変更はテーブル毎に実行する。文字列カラムのないテーブルに実行しても問題ない。全テーブルに対してスクリプトで一括実行するといいかも。
照合順序について
mysql8系ではCOLLATE未指定の場合、utf8mb4_0900_ai_ci
となる
- ai: accent insensitive、アクセントを区別しない
ci; case insensitive、大文字小文字を区別しない
クライアント側の設定
接続して変数を見てみる
mysql> show variables like "character_set%"; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | utf8mb3 | | character_set_connection | utf8mb3 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb3 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | +--------------------------+--------------------------------+ 8 rows in set (0.01 sec)
こうなっていた場合は、クライアント側でcharsetをutf8を明示的に指定していないか確認する。mysql8のデフォルトはutf8mb4なのでどこかで明示的に設定しているはず。設定箇所はmy.cnfの[client]
セクション、または接続時のコマンドラインオプション、アプリケーションのDB設定である
dockerのcompose.yamlを見たところ
mysql-cli: image: mysql:latest command: ["mysql", "-u", "root", "-h", "mysql", "--default-character-set=utf8"] profiles: - one-off
default-character-set
にutf8が設定されていた。これをutf8mb4に修正する
mysql> show variables like "character_set%";\ +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | +--------------------------+--------------------------------+ 8 rows in set (0.01 sec)
直りました。アプリケーションの設定ファイルも見直しましょう(簡単に確認できないので見落としがち)
character_set_system
はメタデータ用の文字セットでデフォルト値のutf8mb3で問題ありません。まだ、変更もできません。
n>
mysql/utf8mb4.txt · 最終更新: 2024/01/19 14:50 by nullpon