UTF-8
UTF-8は、ほとんどのウェブサイトが使用している文字エンコーディングです。UTF-8は1,112,064個の有効なコードポイントそれぞれをエンコードします。この情報すべてを格納するには4バイトが必要です。よく使われる値の大半は3バイトの範囲にあります。MySQLはデフォルトで3バイトのエンコーディングしか使用しないため、4バイトの範囲の値(アジアの文字や絵文字など)は格納できません。4バイト文字を含むテキストを入力しようとすると、Moodleのデータベースエラーになります。
MySQLは4バイトのUTF-8を完全にサポートしていますが、特定のデータベース設定を構成する必要があります。バージョン3.3以降のMoodleは、MySQLとMariaDBの両方でデフォルトで完全なUTF-8を使用します。既存のデータベースは部分的なサポートのままでも動作しますが、完全なサポートに移行することをお勧めします。
Moodleには、MySQL(およびMariaDB)を完全なUTF-8に変換するためのコマンドラインインタフェース(CLI)スクリプトが付属しています。Moodleバージョン3.1.5および3.2.2より前は、この変換ツールは照合順序を「utf8_bin」の何らかのバリエーションに変更するだけでした。推奨される照合順序は「utf8_unicode_ci」でした。現在は、4バイト文字をサポートする「utf8mb4_unicode_ci」の使用をお勧めします(utf8_unicode_ciは3バイトまでしかサポートしません)。
このスクリプトは、データベースの照合順序、文字セット、デフォルトのテーブル設定およびカラム定義の変更を試みます。
まとめると、次のとおりです。
- Moodleの新規インストールでは、データベースサーバが適切に設定されていれば(下記参照)、デフォルトでutf8mb4を使用します。
- Moodleバージョン3.1.5または3.2.2より後のバージョンにアップグレードするサイトでは、スクリプトを使用してutf8mb4に更新できます。Moodle 3.3以降では、データベースが完全なUTF-8サポートを使用していないという警告が表示され、「utf8mb4_unicode_ci」への移行が提案されます。
- MySQL 8.0.28以降またはMariaDB 10.6.1以降を使用している場合を除き、「utf8_*」を使い続けることもできます。これらのバージョンを使用している場合は、utf8mb4に更新する必要があります(これらのバージョンでutf8の名称がutf8mb3に変更されたためです。MDL-74616をご覧ください)。
ファイルフォーマット
varcharのカラムに大きなインデックスを作成できるようにするには、いくつかの設定を組み合わせて設定する必要があります。システムのファイルフォーマットに「Barracuda」を使用する必要があります。これにより、行フォーマットを「Compressed」または「Dynamic」に設定できるようになります。この設定を有効にするには、下記のアップグレード手順をご覧ください。Barracudaファイルフォーマットを使用せずにラージフォーマットを有効にしていると、Moodleはインストールされません。
テーブルごとのファイル
この設定を有効にするには、下記のアップグレード手順をご覧ください。
ラージプレフィックス
この設定は、行フォーマットを「Compressed」または「Dynamic」にすることと組み合わせることで、191文字を超える大きなvarcharインデックスを可能にします。 この設定を有効にするには、下記のアップグレード手順をご覧ください。
アップグレード手順
最も重要なこと:変更を加えたり、CLIスクリプトを実行したりする前に、必ずデータベースをバックアップしてください。
- MySQLの設定を変更します(MariaDBでもまったく同じです)。この手順は任意です。スクリプトを実行すると、スクリプト自身がこれらの変更を試みます。エラーが発生した場合は、以下に示すとおりにこれらの設定を手動で変更してみてください。
- Linuxベースのシステムでは、my.cnfを変更します。このファイルは「/etc/mysql/」にある場合があります。
- my.cnfに次の変更を加えます。
重要な変更、InnoDB:次のInnoDBファイルフォーマット設定オプションはMySQL 5.7.7で非推奨となり、現在は削除されています。
innodb_file_format
innodb_file_format_check
innodb_file_format_max
innodb_large_prefix
[client]
default-character-set = utf8mb4
[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = true
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake
[mysql]
default-character-set = utf8mb4
- MySQLサーバを再起動します。
- CLIスクリプトを実行して、新しい文字セットおよび照合順序に変換します(Moodle 3.1.5、3.2.2またはそれ以降が必要です):
$ php admin/cli/mysql_collation.php --collation=utf8mb4_unicode_ci
- すべてのデータベースおよびテーブルを必ず修復および最適化してください。
mysqlcheck -u root -p --auto-repair --optimize --all-databases
注:非常に大規模なサイトでは、この実行に長い時間がかかる場合があります。本番サイトをオフラインにする前に、テスト用のインストールでどのくらい時間がかかるかを確認しておくとよいでしょう。場合によっては、データをダンプして再インポートすることも検討するとよいでしょう。
- config.phpの$CFG->dboptions配列を調整して、MoodleがMySQLサーバに接続するときに正しい照合順序を使用するようにします:
$CFG->dboptions = array( … 'dbcollation' => 'utf8mb4_unicode_ci', … );
データベースのコマンドライン(またはphpMyaAdminのようなもの)にしかアクセスできない場合は、次のSQLコマンドを試してみてください。
SET GLOBAL innodb_file_format = barracuda;
SET GLOBAL innodb_file_per_table = 1;
SET GLOBAL innodb_large_prefix = 'on';
- Moodleサイトに絵文字(例:😂💩)を追加してみて、アップグレードが成功したことを確認してください。