ユーザ用ツール

サイト用ツール


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_as_ciとなる

クライアント側の設定

接続して変数を見てみる

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で問題ありません(テーブル名、カラム名やインデックス名などに絵文字を入れるような狂ったことをすると問題になるかも)。

mysql/utf8mb4.1700104057.txt.gz · 最終更新: 2023/11/16 03:07 by nullpon