AliSQL支援秒級修改列字元集功能,修改列字元集時僅修改中繼資料而無需重建表,可大幅降低字元集修改耗時,提升營運效率。
功能說明
背景:社區MySQL中UTF-8字元集的預設實現是utf8mb3,由於utf8mb3字元集最大使用3個位元組來儲存1個字元,所以當使用者需要儲存表情(emoji)等4位元組資訊時,會出現資訊丟失。社區從8.0版本開始將預設字元集修改為utf8mb4,但修改存量表中的列字元集時通常需要重建表,耗時較長。
簡介:AliSQL支援秒級修改列字元集(Instant Modify Column Charset)功能。在修改列字元集時,無需通過“建立暫存資料表+拷貝資料”的方式實現表重建,僅需要修改中繼資料,即可實現字元集秒級修改。
演算法:在使用秒級修改列字元集功能時,MySQL 5.7版本僅支援INPLACE演算法,8.0版本支援INPLACE和INSTANT演算法,兩種演算法在實際執行過程中均只修改中繼資料。
適用範圍
如需使用秒級修改列字元集功能,執行個體的資料庫版本需滿足以下條件。當小版本不符合要求時,可以升級核心小版本。
MySQL 8.4
MySQL 8.0:核心小版本大於等於20230630。
MySQL 5.7:核心小版本大於等於20251031。
MySQL 8.0(20251031及以上)和MySQL 8.4支援INPLACE和INSTANT演算法,MySQL 8.0(20251031之前)僅支援INPLACE演算法。
使用秒級修改列字元集功能時,有以下限制:
列類型限制:僅支援對
CAHR和VARCHAR類型的列字元集轉換。字元集限制:僅支援
utf8/utf8mb3轉換為utf8mb4。引擎節流:僅支援
InnoDB引擎。索引限制:不支援修改索引列。
分區鍵限制:不支援修改分區鍵包含的列。
列長度限制:修改列字元集前後,列的最大儲存長度均小於256位元組,或均大於等於256位元組。以
utf8/utf8mb3轉換為utf8mb4為例:對於
utf8/utfbmb3字元集,1字元使用3位元組儲存,256位元組的臨界值為85字元。對於
utf8mb4字元集,1字元使用4位元組儲存,256位元組的臨界值為63字元。

所以只有當列定義的長度(以字元為單位計算)在(0,63]或(85, 65535] 區間內時,才能支援秒級修改列字元集。
參數管理
參數說明
僅當MySQL為8.0版本且需要指定INSTANT演算法時,支援修改以下參數:
參數名稱 | 說明 |
|
|
|
|
修改參數
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列中單擊參數設定。
在可修改參數頁簽內搜尋待修改參數,並配置參數值。
單擊確定,然後單擊提交參數,並在彈出的視窗中選擇生效的時間段。
使用方法
假設待修改的資料表為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 DEFAULT NULL,
`c2` varchar(10) CHARACTER 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;