MySQL で列に UTF-8 を指定すると、エンジンはデフォルトで UTF8MB3 になります。これは、絵文字やその他の補助文字を表すことができない3バイトの Unicode サブセットです。UTF8MB4 への移行には通常、テーブル全体の再構築が必要であり、書き込みをブロックし、大規模なデータセットでは数分以上かかる場合があります。PolarDB for MySQL を使用すると、テーブルを再構築したり、同時 DML をブロックしたりすることなく、列の文字セットを UTF8MB3 から UTF8MB4 に即座に変更できます。
前提条件
開始する前に、ご利用のクラスターが以下のいずれかのバージョン要件を満たしていることを確認してください。
PolarDB for MySQL 8.0.1、リビジョンバージョン 8.0.1.1.40 以降。リビジョンバージョンを確認するには、「エンジンバージョン」の「エンジンバージョンのクエリ」セクションをご参照ください。
説明8.0.1 クラスターでは、この機能を使用する前に
loose_innodb_support_instant_modify_charsetパラメーターを有効にする必要があります。手順については、「文字セットの変更」をご参照ください。PolarDB for MySQL 8.0.2。この機能はデフォルトで有効になっています。追加の構成は不要です。
制限事項
即時文字セット変更は、以下のすべての条件が満たされている場合にのみ適用されます。
サポートされているデータの型
列は、CHAR、VARCHAR、ENUM、または TEXT のいずれかのデータの型である必要があります。
サポートされている変換
UTF8MB3 → UTF8MB4
任意の文字型 → BINARY
列にインデックスがないこと
列にインデックスがあってはなりません。
ストレージ長の境界
以下の両方が満たされている必要があります。
変更前後の最大ストレージ長は、256バイトの境界の同じ側に留まる必要があります。つまり、両方とも256バイト未満であるか、両方とも256バイト以上である必要があります。
変更後の最大ストレージ長は、変更前より短くなってはなりません。
ストレージ長は、列の長さ × 文字あたりのバイト数 として計算されます。UTF8MB3 は文字あたり最大3バイトを使用し、UTF8MB4 は文字あたり最大4バイトを使用し、BINARY は文字あたり1バイトを使用します。
例
| 列の定義 | 変更前 | 変更後 | 即時か? | 理由 |
|---|---|---|---|---|
VARCHAR(85) UTF8MB3 → UTF8MB4 | 85 × 3 = 255 bytes | 85 × 4 = 340 bytes | No | 256バイトの境界を越える (255 → 340) |
CHAR(120) UTF8MB3 → BINARY | 120 × 3 = 360 bytes | 120 × 1 = 120 bytes | No | 変更後の長さが変更前より短い |
VARCHAR(60) UTF8MB3 → UTF8MB4 | 60 × 3 = 180 bytes | 60 × 4 = 240 bytes | Yes | 両方とも256バイト未満。変更後 ≥ 変更前 |
文字セットの変更
ステップ1: パラメーターを有効にする (8.0.1 クラスターのみ)
PolarDB for MySQL 8.0.1 では、ALTER TABLE ステートメントを実行する前に、loose_innodb_support_instant_modify_charset パラメーターを ON に設定してください。
| パラメーター | レベル | デフォルト | 説明 |
|---|---|---|---|
loose_innodb_support_instant_modify_charset | Global | OFF | 即時文字セット変更を有効にします。この機能を使用するには、ON に設定します。 |
クラスターパラメーターの設定手順については、「クラスターとノードのパラメーターを構成する」をご参照ください。
PolarDB for MySQL 8.0.2 では、このステップをスキップしてください。
ステップ2: ALTER TABLE を実行
即時変更を明示的にトリガーするには、ALGORITHM=INPLACE を使用します。
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4, ALGORITHM = INPLACE;PolarDB が利用可能な最速のアルゴリズムを自動的に選択するようにするには、ALGORITHM 句を省略するか、DEFAULT に設定します。
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4, ALGORITHM = DEFAULT;
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4;ALGORITHM=DEFAULT を使用すると、即時変更が可能な場合は PolarDB が INPLACE を選択し、それ以外の場合は COPY にフォールバックします。
INPLACE が失敗した場合
列が「制限事項」を満たさない場合、ステートメントは以下を返します。
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.loose_innodb_support_instant_modify_charset が [有効] に設定されていること(8.0.1 クラスター)および列が「制限事項」のすべての条件を満たしていることを確認してください。
パフォーマンス比較
以下の例では、同一の構造を持つ2つのテーブル (t1 と t2) での実行時間を比較します。各テーブルには1000万行が含まれています。両方のテーブルで、列の文字セットを UTF8MB3 から UTF8MB4 に変更します。
即時変更なし — エンジンはテーブル全体を再構築します。
ALTER TABLE t1 MODIFY COLUMN c varchar(2) CHARACTER SET utf8mb4 NOT NULL DEFAULT '';Query OK, 10000000 rows affected (59.66 sec)
Records: 10000000 Duplicates: 0 Warnings: 0この操作には約1分かかり、DDL プロセス全体ではクエリ操作のみが実行可能です。
即時変更あり — メタデータのみが更新されます。
ALTER TABLE t2 MODIFY COLUMN c varchar(2) CHARACTER SET utf8mb4 NOT NULL DEFAULT '',ALGORITHM = INPLACE;Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0この操作は、テーブルサイズに関係なく0.03秒で完了します。
次のステップ
DDL 操作についてご質問がある場合は、お問い合わせください。
お問い合わせ
DDL 操作に関する質問がある場合は、テクニカルサポートにお問い合わせください。