---
title: "列级字符集和字符序 - OceanBase 数据库 V4.2.1 | OceanBase 文档中心"
description: 列级字符集和字符序 每个字符列（即类型为 CHAR 、 VARCHAR 、 TEXT 或其同义词的列）都有一个列字符集和一个列字符序。 指定列的字符集和字符序 使用 CREATE TABLE 语句创建表或使用 ALTER TABLE 语句修改表时，可以指定列的字符集和字符序。语法如下： CREATE TABLE ta…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.2.1 LTS

# 列级字符集和字符序

更新时间：2026-07-15 20:56:55

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.1/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/100.basic-elements-of-mysql-mode/300.character-set-and-collation-of-mysql-mode/600.column-level-character-set-and-collations-of-mysql-mode.md)  

每个字符列（即类型为 `CHAR`、`VARCHAR`、`TEXT` 或其同义词的列）都有一个列字符集和一个列字符序。

## 指定列的字符集和字符序

使用 `CREATE TABLE` 语句创建表或使用 `ALTER TABLE` 语句修改表时，可以指定列的字符集和字符序。语法如下：

```sql
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]

```

以下是示例：

```sql
-- 创建表 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` 设置相同字符集的不同字符序。

```sql
-- 创建表 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;

```

返回结果示例如下：

```shell
+------+
| a    |
+------+
| a    |
| A    |
| b    |
| B    |
+------+
4 rows in set

```

接着使用 `ORDER BY` 按照所设置的字符序排列。

```sql
-- 查询表 t 中的数据，按照指定字符序 gb18030_2022_chinese_cs 排序
SELECT a FROM t ORDER BY a COLLATE gb18030_2022_chinese_cs;

```

返回结果示例如下：

```shell
+------+
| a    |
+------+
| A    |
| B    |
| a    |
| b    |
+------+
4 rows in set

```

## 列字符集转换条件

要将二进制或非二进制字符串列转换为指定字符集，可以使用 `ALTER TABLE`。要成功转换，必须满足以下条件之一：

- 如果列具有二进制数据类型（`BINARY`、`VARBINARY` 或 `BLOB`），则它包含的所有值都必须使用单个字符集（即要将列转换为的字符集）进行编码。如果使用二进制列来存储多个字符集的信息，OceanBase 数据库无法知道哪些值使用哪个字符集，无法正确转换数据。
 - 如果列具有非二进制数据类型（`CHAR`、`VARCHAR` 或 `TEXT`），则其内容应根据列字符集进行编码。如果列内容以不同的字符集进行编码，可以先将列转换为所使用二进制数据类型，然后再转换为具有所需字符集的非二进制列。

示例如下：

```sql
-- 示例：假设有一个表 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;

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
