文字セットと照合順序は、ApsaraDB RDS for MySQL が文字列データを格納および比較する方法を制御します。サーバー、データベース、テーブル、カラムといった異なるレベルで文字セットが不一致になると、エンコーディングエラーおよび大文字・小文字の区別に関するバグが発生しやすくなります。本ドキュメントでは、照合順序の命名規則、現在の設定を確認する方法、および各レベルで文字セットを変更する方法について説明します。
照合順序の命名規則
照合順序の名前は、関連付けられた文字セットの名前から始まり、以下のいずれかの接尾辞で終わります。
| 接尾辞 | 意味 |
|---|---|
_ci | 大文字・小文字を区別しない |
_cs | 大文字・小文字を区別する |
_bin | コードポイントに基づくバイナリ比較(常に大文字・小文字を区別) |
例:collation_connection が utf8_general_ci に設定されている場合、a と A の値は等価と見なされます。一方、utf8_bin を使用すると、これらは等価とは見なされません。

文字セットの継承
文字セットは、サーバー → データベース → テーブル → カラムという順序でカスケード(継承)されます。明示的に文字セットが指定されていないカラムは、その所属テーブルから継承します。同様に、テーブルはデータベースから、データベースはサーバーからそれぞれ継承します。
このため、テーブルの文字セットを変更しても、すでに明示的な文字セットが指定されているカラムには影響しません。これらのカラムは個別に更新する必要があります。
文字セット設定の確認
ご利用の RDS インスタンスにおける現在の文字セットおよび照合順序の設定を確認するには、以下の SQL ステートメントを使用します。
-- 現在の設定を確認
SHOW GLOBAL VARIABLES LIKE '%char%'; -- RDS インスタンスの文字セットパラメーター
SHOW GLOBAL VARIABLES LIKE 'coll%'; -- 現在のセッションの照合順序パラメーター
SHOW CHARACTER SET; -- RDS インスタンスでサポートされる文字セット
SHOW COLLATION; -- RDS インスタンスでサポートされる照合順序
SHOW CREATE TABLE table_name \G -- 特定のテーブルの文字セット
SHOW CREATE DATABASE database_name \G -- 特定のデータベースの文字セット
SHOW CREATE PROCEDURE procedure_name \G -- ストアドプロシージャの文字セット
SHOW PROCEDURE STATUS \G -- すべてのストアドプロシージャの文字セット設定
SHOW FULL FIELDS FROM table_name; -- テーブル内の各カラムの文字セット
ALTER DATABASE db_name DEFAULT CHARSET utf8; -- データベースの文字セットを変更
CREATE DATABASE db_name CHARACTER SET utf8; -- データベース作成時に文字セットを指定
ALTER TABLE tab_name DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- テーブルの文字セットおよび照合順序を変更
character_set_server パラメーターの変更
character_set_server パラメーターは、サーバーレベルのデフォルト文字セットを設定します。このパラメーターを変更すると、変更が有効になった後に作成されるすべてのデータベースに影響します。
character_set_server の変更には、RDS インスタンスの再起動が必要です。この変更は、トラフィックが少ない時間帯に実施してください。
ApsaraDB RDS コンソール にログインします。
上部のナビゲーションバーで、RDS インスタンスが配置されているリージョンを選択します。

RDS インスタンスを検索し、インスタンス ID をクリックします。
左側のナビゲーションウィンドウで、パラメーター をクリックします。
「編集可能なパラメーター」タブで、
character_set_serverを見つけて、[実行中のパラメーター値] 列の
アイコンをクリックします。ダイアログボックスに新しい値を入力して、[OK] をクリックします。変更の適用 をクリックします。表示されたダイアログボックスで OK をクリックし、RDS インスタンスの再起動を待ちます。
この変更は、RDS インスタンスに対して特権アカウントが作成された後に作成されるデータベースにのみ有効です。
SQL を使用した文字セットの変更
構文
データベース、テーブル、またはカラムレベルで文字セットを変更するには、以下のステートメントを使用します。
-- データベースの文字セットを変更
ALTER DATABASE <database_name> CHARACTER SET <charset_name> COLLATE <collation_name>;
-- テーブルの文字セットを変更(明示的な文字セットが指定されていないすべてのカラムを変換)
ALTER TABLE <table_name> CONVERT TO CHARACTER SET <charset_name> COLLATE <collation_name>;
-- 特定のカラムの文字セットを変更
ALTER TABLE <table_name> MODIFY <column_name> <data_type> CHARACTER SET <charset_name> COLLATE <collation_name>;例
dbsdq データベース、tt2 テーブル、および c2 カラムの文字セットを utf8mb4 に変更します。
ALTER DATABASE dbsdq CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE dbsdq;
ALTER TABLE tt2 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tt2 MODIFY c2 VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;使用上の注意点
カラムの変更は、すべての既存行に即座に適用されます。 カラムの文字セットを変更すると、そのカラム内のすべての既存行に対して新しい文字セットが適用されます。
`ALTER TABLE` はメタデータロック (MDL) を取得します。 このロックは操作の完了まで保持され、その間、テーブルへの同時書き込みがブロックされます。
正しいレベルで文字セットを指定してください。 文字セットは、サーバー、データベース、テーブル、およびフィールドの各レベルで指定できます。サーバーレベル、データベースレベル、およびテーブルレベルの文字セットはデフォルト設定を用います。オブジェクトに対して文字セットを明示的に指定する場合は、そのオブジェクトの文字セットを個別に変更する必要があります。そうでない場合、デフォルトでサーバーレベルの文字セットが使用されます。
データベースの文字セットを変更しても、既存のテーブルやカラムは更新されません。 各オブジェクトは個別に変更してください。変更前後で各カラムの現在の文字セットを確認するには、
SHOW CREATE TABLE table_name;またはSHOW FULL FIELDS FROM table_name;を使用します。