在MySQL中,當使用者指定列的字元集為UTF-8時,會預設使用utf8mb3字元集,該字元集最大使用3個位元組來儲存字元。如果使用者需要儲存表情(emoji)等資訊時,則需要將列字元集修改為utf8mb4。一般情況下,修改列字元集需要重建表,耗時較長,且對業務影響較大。PolarDB MySQL版支援秒級修改列字元集,使用該功能您可以快速地修改字元集,且對業務無感。
前提條件
叢集版本需為以下版本之一:
PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.40及以上,您可以通過查詢版本號碼來確認叢集版本。
說明您需要先配置
loose_innodb_support_instant_modify_charset參數才能在PolarDB MySQL版8.0.1版本的叢集上使用該功能。PolarDB MySQL版8.0.2版本。
說明PolarDB MySQL版8.0.2版本的叢集預設支援秒級修改列字元集功能,無需配置任何參數。
使用限制
僅支援修改列類型為CHAR、VARCHAR、ENUM以及TEXT的列的字元集。
僅支援將列字元集由utf8mb3修改為utf8mb4,或將任一字元集修改為BINARY類型。
需要修改列字元集的列上沒有建立任何索引。
修改列字元集前後,列的長度必須滿足以下要求:
修改列字元集前後,列的最大儲存長度均小於256個位元組,或均大於255個位元組。儲存長度為字元集實際消耗的儲存長度。
例如,某列使用的字元集為utf8mb3,且列類型為VARCHAR(85),由於utf8mb3最大使用3個位元組來儲存字元,因此,該列的最大儲存長度為
85*3=255位元組。若將該列的字元集修改為utf8mb4,其最大儲存長度為85*4=340位元組,由於修改列字元集後的最大儲存長度大於256個位元組,因此,修改該列字元集時不能秒級完成。目標字元集的列的最大儲存長度不能小於原字元集的列的最大儲存長度。
例如,某列類型為CHAR(120),且使用的字元集為utf8mb3,列的最大儲存長度為
120*3=360位元組。修改為BINARY類型後,列的最大儲存長度為120*1=120位元組。因此,該列不滿足秒級修改列字元集的要求。
使用方法
配置參數。
針對PolarDB MySQL版8.0.1版本,您需要將參數
loose_innodb_support_instant_modify_charset的值設定為ON,才能使用秒級修改列字元集功能。設定參數值的具體操作請參見設定叢集參數和節點參數。參數名稱
參數層級
說明
loose_innodb_support_instant_modify_charset
Global
秒級修改列字元集功能控制開關。取值範圍如下:
OFF(預設):關閉秒級修改列字元集功能。
ON:開啟秒級修改列字元集功能。
修改列字元集。
指定ALGORITHM=INPLACE以強制使用秒級修改列字元集功能。樣本如下:
ALTER TABLE tablename MODIFY COLUMN test_column varchar(60) CHARACTER SET utf8mb4, ALGORITHM = INPLACE;使用上述語句時。若返回以下錯誤,表示當前修改列字元集操作不能以INPLACE演算法執行,建議您查看參數
loose_innodb_support_instant_modify_charset的值是否設定為ON,並仔細檢查是否滿足使用限制章節描述的情形。ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.不指定ALGORITHM或指定ALGORITHM=DEFAULT,PolarDB會自行選擇執行速度最快的演算法來執行修改操作。樣本如下:
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;
使用效果
以包含一千萬資料的表t1和t2為例,測試開啟和關閉秒級修改列字元集時,將列的字元集由utf8mb3修改為utf8mb4的執行效果。其中,表t1和t2的表結構以及資料量完全相同。
關閉秒級修改列字元集功能時,修改列的字元集需要重建表,執行時間大約需要1分鐘左右,且整個DDL過程中只能執行查詢操作。
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開啟秒級修改列字元集功能之後,修改列字元集可以無視表資料量大小,秒級完成修改列字元集操作。
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
聯絡我們
若您對DDL操作有任何疑問,請聯絡我們。