AliSQL は、カラム文字セットの即時変更機能をサポートしています。この機能はメタデータのみを変更し、テーブルの再構築を回避します。これにより、操作時間が大幅に短縮され、効率が向上します。
機能概要
背景:コミュニティ版 MySQL では、UTF-8 文字セットのデフォルト実装は utf8mb3 です。utf8mb3 文字セットは 1 文字あたり最大 3 バイトを使用するため、絵文字などの 4 バイト文字を格納するとデータ損失が発生します。コミュニティ版 MySQL はバージョン 8.0 からデフォルトの文字セットを utf8mb4 に変更しましたが、既存のテーブルの列の文字セットを変更するには、通常、時間のかかるテーブルの再構築が必要です。
概要:AliSQL は、カラム文字セットの即時変更機能をサポートしています。一時テーブルを作成してデータをコピーするテーブルの再構築の代わりに、この機能はメタデータのみを変更します。これにより、文字セットの変更が数秒で完了します。
アルゴリズム:どちらのアルゴリズムもメタデータのみを変更することで操作を完了します。 カラム文字セットの即時変更機能を使用する場合、MySQL 5.7 は INPLACE アルゴリズムのみをサポートします。 MySQL 8.0 は INPLACE アルゴリズムと INSTANT アルゴリズムの両方をサポートします。
前提条件
カラム文字セットの即時変更機能を使用するには、インスタンスが次のいずれかのデータベースバージョン要件を満たす必要があります。マイナーエンジンバージョンが要件を満たしていない場合は、マイナーエンジンバージョンをアップグレードできます。
MySQL 8.4
MySQL 8.0:マイナーエンジンバージョン 20230630 以降。
MySQL 5.7:マイナーエンジンバージョン 20221031 以降。
MySQL 8.0 (マイナーエンジンバージョン 20230630 以降) および MySQL 8.4 は、INPLACE と INSTANT の両方のアルゴリズムをサポートします。 MySQL 8.0 (マイナーエンジンバージョンが 20230630 より前) は、INPLACE アルゴリズムのみをサポートします。
カラム文字セットの即時変更機能には、次の制限があります:
列のタイプ: 文字セットを変換できるのは、
CHAR型およびVARCHAR型の列のみです。文字セット:
utf8/utf8mb3からutf8mb4への変換のみがサポートされています。ストレージエンジン:
InnoDBストレージエンジンのみがサポートされています。インデックスカラム:インデックスカラムは変更できません。
パーティションキー:パーティションキーの一部であるカラムは変更できません。
カラム長:変更によって、カラムの最大格納長が 256 バイトの境界を越えることがあってはなりません。長さは、256 バイト未満、または 256 バイト以上のいずれかの状態を維持する必要があります。
utf8/utf8mb3からutf8mb4への変換の場合:1 文字あたり 3 バイトを使用する
utf8/utfbmb3文字セットの場合、256 バイトのしきい値は 85 文字です。1 文字あたり 4 バイトを使用する
utf8mb4文字セットの場合、256 バイトのしきい値は 63 文字です。

したがって、カラム文字セットの即時変更機能は、定義されたカラム長 (文字数) が (0, 63] または (85, 65535] の範囲内である場合にのみサポートされます。
パラメーター管理
パラメーター
次のパラメーターは、MySQL 8.0 を使用し、INSTANT アルゴリズムを指定する必要がある場合にのみ変更します:
パラメーター | 説明 |
|
|
|
|
パラメーターの変更
- RDSインスタンスにアクセスし、上部のリージョンを選択し、対象のRDSインスタンスのIDをクリックします。
左側のナビゲーションペインで、[パラメーター設定] をクリックします。
[編集可能なパラメーター] タブで、変更するパラメーターを検索し、その値を変更します。
[OK] をクリックし、次に[パラメーターの送信]をクリックします。表示されるダイアログボックスで、新しいパラメーター値がいつ有効になるかを指定します。
手順
この手順では、次のスキーマのテーブル t1 を例として使用します。
CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` char(10) DEFAULT NULL,
`c2` varchar(10) DEFAULT NULL,
`c3` char(100) DEFAULT NULL,
`c4` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;アルゴリズムの指定
列の文字セットを変更する際に、INPLACE または INSTANT アルゴリズムを指定できます。
Inplace アルゴリズム
-- INPLACE アルゴリズムを指定して、c1 および c2 カラムの文字セットを utf8mb4 に変更します。
ALTER TABLE `t1` MODIFY `c1` char(10) CHARACTER SET utf8mb4 DEFAULT NULL, ALGORITHM=INPLACE;
ALTER TABLE `t1` MODIFY `c2` varchar(10) CHARACTER SET utf8mb4 DEFAULT NULL, ALGORITHM=INPLACE;
-- 結果を表示します。
SHOW CREATE TABLE `t1`\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`c1` char(10) CHARACTER SET utf8mb4 DEFAULT NULL,
`c2` varchar(10) CHARACTER SET utf8mb4 DEFAULT NULL,
`c3` char(100) DEFAULT NULL,
`c4` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Instant アルゴリズム
-- INSTANT アルゴリズムを指定して、c3 および c4 カラムの文字セットを utf8mb4 に変更します。
ALTER TABLE `t1` MODIFY `c3` char(100) CHARACTER SET utf8mb4 DEFAULT NULL, ALGORITHM=INSTANT;
ALTER TABLE `t1` MODIFY `c4` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL, ALGORITHM=INSTANT;
-- 結果を表示します。
SHOW CREATE TABLE `t1`\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`c1` char(10) CHARACTER SET utf8mb4 DEFAULT NULL,
`c2` varchar(10) CHARACTER SET utf8mb4 DEFAULT NULL,
`c3` char(100) CHARACTER SET utf8mb4 DEFAULT NULL,
`c4` varchar(100) CHARACTER SET utf8mb4 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)アルゴリズムの自動選択
アルゴリズムを指定しない場合、MySQL は自動的に最適なものを選択します。
-- アルゴリズムを指定せずに、c1 カラムの文字セットを utf8mb4 に変更します。
ALTER TABLE `t1` MODIFY `c1` char(10) CHARACTER SET utf8mb4 DEFAULT NULL;