全部產品
Search
文件中心

ApsaraDB RDS:秒級修改列字元集

更新時間:May 13, 2026

AliSQL支援秒級修改列字元集功能,修改列字元集時僅修改中繼資料而無需重建表,可大幅降低字元集修改耗時,提升營運效率。

功能說明

背景:社區MySQL中UTF-8字元集的預設實現是utf8mb3,由於utf8mb3字元集最大使用3個位元組來儲存1個字元,所以當使用者需要儲存表情(emoji)等4位元組資訊時,會出現資訊丟失。社區從8.0版本開始將預設字元集修改為utf8mb4,但修改存量表中的列字元集時通常需要重建表,耗時較長。

簡介:AliSQL支援秒級修改列字元集(Instant Modify Column Charset)功能。在修改列字元集時,無需通過“建立暫存資料表+拷貝資料”的方式實現表重建,僅需要修改中繼資料,即可實現字元集秒級修改。

演算法:在使用秒級修改列字元集功能時,MySQL 5.7版本僅支援INPLACE演算法,8.0版本支援INPLACEINSTANT演算法,兩種演算法在實際執行過程中均只修改中繼資料。

適用範圍

如需使用秒級修改列字元集功能,執行個體的資料庫版本需滿足以下條件。當小版本不符合要求時,可以升級核心小版本

  • MySQL 8.4

  • MySQL 8.0:核心小版本大於等於20230630。

  • MySQL 5.7:核心小版本大於等於20251031。

說明

MySQL 8.0(20251031及以上)和MySQL 8.4支援INPLACEINSTANT演算法,MySQL 8.0(20251031之前)僅支援INPLACE演算法。

使用秒級修改列字元集功能時,有以下限制:

  • 列類型限制:僅支援對CAHRVARCHAR類型的列字元集轉換。

  • 字元集限制:僅支援utf8/utf8mb3轉換為utf8mb4

  • 引擎節流:僅支援InnoDB引擎。

  • 索引限制:不支援修改索引列。

  • 分區鍵限制:不支援修改分區鍵包含的列。

  • 列長度限制:修改列字元集前後,列的最大儲存長度均小於256位元組,或均大於等於256位元組。以utf8/utf8mb3轉換為utf8mb4為例:

    • 對於utf8/utfbmb3字元集,1字元使用3位元組儲存,256位元組的臨界值為85字元。

    • 對於utf8mb4字元集,1字元使用4位元組儲存,256位元組的臨界值為63字元。

    image

    所以只有當列定義的長度(以字元為單位計算)在(0,63]或(85, 65535] 區間內時,才能支援秒級修改列字元集。

參數管理

參數說明

僅當MySQL為8.0版本且需要指定INSTANT演算法時,支援修改以下參數:

參數名稱

說明

loose_rds_upgrade_datatype_instant_enable

  • 描述:秒級修改列類型功能開關。

  • 參數範圍:全域參數。

  • 資料類型:Boolean

  • 預設值:OFF

  • 取值範圍:ONOFF

  • 是否需要重啟執行個體:否。

loose_innodb_instant_ddl_enabled

  • 描述:Instant DDL 總開關。

  • 參數範圍:全域參數。

  • 資料類型:Boolean

  • 預設值:ON

  • 取值範圍:ONOFF

  • 是否需要重啟執行個體:否。

修改參數

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側導覽列中單擊參數設定

  3. 可修改參數頁簽內搜尋待修改參數,並配置參數值。

  4. 單擊確定,然後單擊提交參數,並在彈出的視窗中選擇生效的時間段。

使用方法

假設待修改的資料表為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;

指定演算法修改列字元集

您可以在修改列字元集時指定INPLACEINSTANT演算法。

指定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;