基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
列级字符集和字符序
更新时间:2026-07-15 20:56:55
每个字符列(即类型为 CHAR、VARCHAR、TEXT 或其同义词的列)都有一个列字符集和一个列字符序。
指定列的字符集和字符序
使用 CREATE TABLE 语句创建表或使用 ALTER TABLE 语句修改表时,可以指定列的字符集和字符序。语法如下:
CREATE TABLE table_name (
column_name {CHAR | VARCHAR | TEXT} (column_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
);
ALTER TABLE table_name MODIFY
col_name {CHAR | VARCHAR | TEXT} (column_length)
CHARACTER SET [=] charset_name
[COLLATE [=] collation_name]
以下是示例:
-- 创建表 t,包含一个 VARCHAR 类型的列 col1,设置字符集为 utf8mb4,字符序为 utf8mb4_unicode_ci
CREATE TABLE t (
col1 VARCHAR(5)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci);
Query OK, 0 rows affected
-- 修改表 t 的列 col1,将字符集修改为 gbk,字符序修改为 gbk_chinese_ci
ALTER TABLE t MODIFY
col1 VARCHAR(5)
CHARACTER SET gbk
COLLATE gbk_chinese_ci;
Query OK, 0 rows affected
选择列的字符集和字符序规则
OceanBase 数据库在选择列的字符集和字符序时遵循以下规则:
如果同时指定了
CHARACTER SET charset_name和COLLATE collation_name,则使用字符集charset_name和字符序collation_name。如果指定了
CHARACTER SET charset_name但未指定COLLATE,则使用字符集charset_name及其默认字符序。可通过SHOW CHARACTER SET语句查看每个字符集的默认字符序。如果指定了
COLLATE collation_name但未指定CHARACTER SET,则使用与collation_name关联的字符集和指定的字符序。如果既不指定
CHARACTER SET也不指定COLLATE,则使用表的字符集和字符序。
如果在各个列定义中未指定列字符集和字符序,则表的字符集和字符序将用作列定义的默认值。
此外,在 OceanBase 数据库的 MySQL 模式下,设置列的 COLLATE 后,可以直接使用 ORDER BY 按照所设置的字符序排列,也可以在 ORDER BY 后使用 COLLATE 设置相同字符集的不同字符序。
-- 创建表 t,包含一个 VARCHAR 类型的列 a,设置字符序为 gb18030_2022_radical_ci
CREATE TABLE t(a VARCHAR(10) COLLATE gb18030_2022_radical_ci);
-- 向表 t 插入数据
INSERT INTO t VALUES('a'),('A'),('b'),('B');
-- 查询表 t 中的数据,按照默认字符序排序
SELECT a FROM t ORDER BY a;
返回结果示例如下:
+------+
| a |
+------+
| a |
| A |
| b |
| B |
+------+
4 rows in set
接着使用 ORDER BY 按照所设置的字符序排列。
-- 查询表 t 中的数据,按照指定字符序 gb18030_2022_chinese_cs 排序
SELECT a FROM t ORDER BY a COLLATE gb18030_2022_chinese_cs;
返回结果示例如下:
+------+
| a |
+------+
| A |
| B |
| a |
| b |
+------+
4 rows in set
列字符集转换条件
要将二进制或非二进制字符串列转换为指定字符集,可以使用 ALTER TABLE。要成功转换,必须满足以下条件之一:
如果列具有二进制数据类型(
BINARY、VARBINARY或BLOB),则它包含的所有值都必须使用单个字符集(即要将列转换为的字符集)进行编码。如果使用二进制列来存储多个字符集的信息,OceanBase 数据库无法知道哪些值使用哪个字符集,无法正确转换数据。如果列具有非二进制数据类型(
CHAR、VARCHAR或TEXT),则其内容应根据列字符集进行编码。如果列内容以不同的字符集进行编码,可以先将列转换为所使用二进制数据类型,然后再转换为具有所需字符集的非二进制列。
示例如下:
-- 示例:假设有一个表 t,包含一个列 col1,类型为 VARCHAR,字符集为 utf8mb4,字符序为 utf8mb4_unicode_ci
CREATE TABLE t (
col1 VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
-- 将二进制列 col1 转换为字符集为 gbk,字符序为 gbk_chinese_ci 的 VARCHAR 列
ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET gbk COLLATE gbk_chinese_ci;