Craft CMS で MySQL のテーブル文字コードと照合順序を変更する

先日、Craft CMS のデータベースを眺めてたところ、MySQL 8.0 でテーブルの文字コードが utf8mb3、照会順序が utf8mb3_general_ci になっている場合があることに気づきました。

文字コードは utf8 もしくは utf8mb4 を指定しているハズなので、にわかに不安が。。

公式リファレンスを確認したところ、そもそも utf8utf8mb3 のエイリアスで、MySQL 8.0 以降は非推奨なんですね。 将来的に削除される可能性があるということで、あらかじめ utf8mb4 に変更しておいた方が良さそうです。

MySQL :: MySQL 8.0 リファレンスマニュアル :: 10.9.2 utf8mb3 文字セット (3 バイトの UTF-8 Unicode エンコーディング)
https://dev.mysql.com/doc/refman/8.0/ja/charset-unicode-utf8mb3.html

そこで、今回は MySQL のテーブル文字コードと照合順序を変更する方法をご紹介したいと思います。
これは Craft CMS Advent Calendar 2023 23日目の記事です。

システムのデフォルト値を確認

変更する前に、Craft CMS のデフォルト値を確認しておきましょう。

Database Connection Settings | Craft CMS Documentation | 4.x
https://craftcms.com/docs/4.x/config/db.html#collation

公式ドキュメントのデータベース接続設定には、以下のように記載されています。

文字セット(charset)デフォルトの照合順序(collation)
utf8utf8_general_ci
utf8mb4utf8mb4_0900_ai_ci

Craft 4 のデフォルトの文字セットが utf8 のため、明示的に変更していなければ utf8mb3 になっている可能性がある、ということですね。

次に、utf8mb4 にした場合のデフォルトの照合順序を確認してみます。

utf8mb4_0900_ai_ci でいいのか?問題

MySQL 8.0 以降は、utf8mb4_0900_ai_ci がデフォルトの照合順序になっています。
Craft CMS もそれに準じているようですが、日本語を扱うサイトでは検討が必要です。

MySQL の utf8mb4 の文字照合順序まとめ
https://zenn.dev/zoeponta/articles/090c68ba820a24

こちらの記事の確認結果にわかりやすくまとめられていて、照合順序ごとにひらがな・カタカナ・拗音・濁音などの扱いが異なることがわかります。

多言語サイトであれば英文のキャピタライズを踏まえて utf8mb4_general_ci、日本語サイトのみであれば utf8mb4_bin あたりで良さそうです。ただし、用途によると思いますので、よりベターなものを選択してください。

今回は、utf8mb4_general_ci に変更してみます。

コンソールコマンドで変更する

Craft CMS には、データベースの文字コードと照合順序を変更するコンソールコマンドが用意されています。

Console Commands | Craft CMS Documentation | 4.x
https://craftcms.com/docs/4.x/console-commands.html#db-convert-charset

./craft db/convert-charset utf8mb4 utf8mb4_general_ci

このコマンドを実行すると、次の画像のように即座に変換処理が走りますので、事前にバックアップを取っておきましょう。

コマンド実行結果のサンプル

これで、テーブルの文字コードと照合順序が変更されました。

まとめ

今回は、Craft CMS で MySQL のテーブル文字コードと照合順序を変更する方法をご紹介しました。
専用のコンソールコマンドが用意されているため、簡単に変更できるのが助かりますね。

Craft 3 時代から運用しているサイトは utf8 を指定していることがあるため、適宜切り替えていこうと思います。