MySQLの列にUTF-8文字セットを指定すると、デフォルトでUTF8MB3文字セットが使用されます。 この文字セットは、各文字を格納するために最大3バイトを使用します。 絵文字などの情報を保存する必要がある場合は、列文字セットをUTF8MB4に変更する必要があります。 ほとんどの場合、列文字セットを変更する場合は、テーブル全体を再構築する必要があります。 このプロセスは時間がかかり、ビジネスに大きな影響を与えます。 PolarDB for MySQLを使用すると、ビジネスに影響を与えることなく、列文字セットを即座に変更できます。
前提条件
クラスターは、次のいずれかのバージョン要件を満たしています。
リビジョンバージョンが8.0.1.1.40以降のPolarDB for MySQL 8.0.1クラスター。 クラスターのバージョンを表示する方法については、「エンジンバージョン」トピックのエンジンバージョン5.6、5.7、8.0セクションを参照してください。
説明PolarDB for MySQL 8.0.1のクラスターでこの機能を使用するには、まず
loose_innodb_support_instant_modify_charsetパラメーターを設定する必要があります。PolarDB for MySQL 8.0.2。
説明この機能は、PolarDB for MySQL 8.0.2クラスターですぐに使用できます。 追加の設定は必要ありません。
制限
CHAR、VARCHAR、ENUM、またはTEXTデータ型の列の文字セットのみを変更できます。
列の文字セットをUTF8MB3からUTF8MB4に、または列のデータ型をランダム型からBINARYに変更できます。
文字セットを変更する必要がある列にはインデックスが作成されません。
文字セットを変更する必要がある列の長さは、次の要件を満たす必要があります。
列の文字セットを変更する前後で, 列の最大格納長が256バイト未満または255バイトを超えています。 ストレージ長は、文字セットが実際に占有するバイト数です。
たとえば、VARCHAR(85) データ型の列がUTF8MB3文字セットを使用する場合、列の最大格納長は
85 × 3 = 255バイトで計算されます。 これは、UTF8MB3文字セットが各文字を格納するために最大3バイトを使用するためです。 列の文字セットをUTF8MB4に変更した場合, 列の最大格納長は85 × 4 = 340バイトで計算されます。 変更後の最大格納長が256バイトを超えるため、列の文字セットはすぐには変更できません。変更後の列の最大ストレージ長は、変更前の最大ストレージ長より短くすることはできません。
たとえば, CHAR(120) データ型の列がUTF8MB3文字セットを使用している場合, 列の最大格納長は
120 × 3 = 360バイトと計算されます。 列のデータ型をBINARYに変更した場合、列の最大格納長は120 × 1 = 120バイトで計算されます。 この場合、列の文字セットを即座に変更することはできません。
この機能を使用して列文字セットを即座に変更
パラメーターの設定
PolarDB For MySQL 8.0.1のクラスターの場合、この機能を有効にするには、
loose_innodb_support_instant_modify_charsetパラメーターをONに設定する必要があります。 パラメーターの設定方法の詳細については、「クラスターとノードパラメーターの設定」をご参照ください。パラメーター
レベル
説明
loose_innodb_support_instant_modify_charset
グローバル
列文字セットを即座に変更する機能を有効にするかどうかを指定します。 デフォルト値: OFF。 有効な値:
オフ
オン
ステートメントを実行します。
ALGORITHMパラメーターをINPLACEに設定して、列文字セットを強制的に変更できるようにします。 例:
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4、ALGORITHM = INPLACE;INPLACEアルゴリズムが使用できない場合、次のメッセージが返されます。 この場合、
loose_innodb_support_instant_modify_charsetパラメーターがONに設定されているかどうかを確認し、このトピックの「制限」セクションで説明されているルールを確認することを推奨します。エラー1846 (0A000): ALGORITHM=INPLACEはサポートされていません。 理由: 列タイプINPLACEを変更できません。 ALGORITHM=COPYを試してください。ALGORITHMパラメーターをDEFAULTに設定した場合、またはALGORITHMパラメーターを指定しない場合、PolarDBは最速のアルゴリズムを選択して列文字セットを変更します。 例:
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) 文字セットutf8mb4、ALGORITHM=デフォルト; ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) キャラクターセットutf8mb4;
実行結果の表示
この例では、t1とt2という名前の2つのテーブルが使用され、各テーブルには1千万行のデータが含まれます。 即座に列文字セットを変更する機能が有効および無効になると、列文字セットはUTFMB3からUTF8MB4に変更されます。 t1およびt2テーブルは、同じテーブル構造およびデータサイズを有する。
この機能を無効にすると、列文字セットを変更する場合は、テーブル全体を再構築する必要があります。 テーブル全体を再作成して列文字セットを変更するには約1分かかり、DDLプロセス全体でクエリ操作しか実行できません。
ALTER TABLE t1 MODIFY COLUMN c varchar(2) 文字セットutf8mb4 NOT NULL DEFAULT '';サンプル結果:
クエリOK、影響を受ける行10000000 (59.66秒) 記録: 10000000重複: 0警告: 0この機能を有効にすると、テーブルのデータサイズに関係なく、列文字セットを即座に変更できます。
ALTER TABLE t2 MODIFY COLUMN c varchar(2) 文字セットutf8mb4 NOT NULL DEFAULT ''、ALGORITHM = INPLACE;サンプル結果:
クエリOK、影響を受ける0行 (0.03秒) レコード: 0重複: 0警告: 0