ユーザ用ツール

サイト用ツール


mysql:utf8mb4

文書の過去の版を表示しています。


utf8mb

utf8mb4にアップグレード

文字列カラムのcharsetをutf8(utf8mb3)からutf8mb4に変換する手順

DBのdefault charsetを変更

ALTER DATABASE <db name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_ci;

Tableの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はdefaultでutf8mb4なのでどこかで設定しているはず)

設定箇所はmy.cnfの[client]セクション、または接続時のコマンドラインオプション、アプリケーションのDB設定である

  mysql-cli:
    image: mysql:latest
    command: ["mysql", "-u", "root", "-h", "mysql", "--default-character-set=utf8"]
    profiles:

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.1700100620.txt.gz · 最終更新: 2023/11/16 02:10 by nullpon