📣

TiDB Cloud Serverless 现已更名为
Starter
!此页面由 AI 自动翻译,英文原文请见
此处。

GBK

从 v5.4.0 版本开始,TiDB 支持 GBK 字符集。本文档提供了 TiDB 对 GBK 字符集的支持和兼容性信息。

从 v6.0.0 版本开始,TiDB 默认启用 新字符集排序框架。TiDB 中 GBK 字符集的默认排序规则为 gbk_chinese_ci,与 MySQL 保持一致。

SHOW CHARACTER SET WHERE CHARSET = 'gbk';
+---------+-------------------------------------+-------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+-------------------------------------+-------------------+--------+ | gbk | Chinese Internal Code Specification | gbk_chinese_ci | 2 | +---------+-------------------------------------+-------------------+--------+ 1 row in set (0.00 sec)
SHOW COLLATION WHERE CHARSET = 'gbk';
+----------------+---------+----+---------+----------+---------+---------------+ | Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | +----------------+---------+----+---------+----------+---------+---------------+ | gbk_bin | gbk | 87 | | Yes | 1 | PAD SPACE | | gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 | PAD SPACE | +----------------+---------+----+---------+----------+---------+---------------+ 2 rows in set (0.00 sec)

MySQL 兼容性

本节提供 MySQL 与 TiDB 之间的兼容性信息。

排序规则

默认情况下,TiDB Cloud 启用 新字符集排序框架,GBK 字符集的默认排序规则为 gbk_chinese_ci

此外,由于 TiDB 会将 GBK 转换为 utf8mb4 后再使用二进制排序规则,因此 TiDB 中的 gbk_bin 排序规则与 MySQL 中的 gbk_bin 不完全相同。

非法字符兼容性

  • 如果系统变量 character_set_clientcharacter_set_connection 没有同时设置为 gbk,TiDB 处理非法字符的方式与 MySQL 相同。

  • 如果 character_set_clientcharacter_set_connection 都设置为 gbk,TiDB 处理非法字符的方式与 MySQL 不同。

    • MySQL 在读写操作中对非法 GBK 字符集的处理方式不同。
    • TiDB 在读写操作中对非法 GBK 字符集的处理方式相同。在 SQL 严格模式下,TiDB 在读取或写入非法 GBK 字符时会报错;在非严格模式下,TiDB 会用 ? 替换非法 GBK 字符。

例如,执行 SET NAMES gbk 后,如果在 MySQL 和 TiDB 中分别使用 CREATE TABLE gbk_table(a VARCHAR(32) CHARACTER SET gbk) 创建表,然后执行下表中的 SQL 语句,可以看到详细差异。

数据库如果配置的 SQL 模式包含 STRICT_ALL_TABLESSTRICT_TRANS_TABLES如果配置的 SQL 模式既不包含 STRICT_ALL_TABLES 也不包含 STRICT_TRANS_TABLES
MySQLSELECT HEX('一a');
e4b88061

INSERT INTO gbk_table values('一a');
Incorrect Error
SELECT HEX('一a');
e4b88061

INSERT INTO gbk_table VALUES('一a');
SELECT HEX(a) FROM gbk_table;
e4b8
TiDBSELECT HEX('一a');
Incorrect Error

INSERT INTO gbk_table VALUES('一a');
Incorrect Error
SELECT HEX('一a');
e4b83f

INSERT INTO gbk_table VALUES('一a');
SELECT HEX(a) FROM gbk_table;
e4b83f

在上述表中,SELECT HEX('a');utf8mb4 字节集中的结果为 e4b88061

其他 MySQL 兼容性

  • 目前,TiDB 不支持使用 ALTER TABLE 语句将其他字符集类型转换为 gbk,或将 gbk 转换为其他字符集。
  • TiDB 不支持使用 _gbk。例如:

    CREATE TABLE t(a CHAR(10) CHARSET BINARY); Query OK, 0 rows affected (0.00 sec) INSERT INTO t VALUES (_gbk'啊');
    ERROR 1115 (42000): Unsupported character introducer: 'gbk'
  • 目前,对于 ENUMSET 类型的二进制字符,TiDB 将其视为 utf8mb4 字符集。

组件兼容性

  • 目前,TiFlash 不支持 GBK 字符集。

  • TiDB 数据迁移工具(DM)不支持将 charset=GBK 的表迁移到早于 v5.4.0 的 TiDB 集群。

  • TiDB Lightning 不支持导入 charset=GBK 的表到早于 v5.4.0 的 TiDB 集群。

  • 早于 v6.1.0 版本的 TiCDC 不支持复制 charset=GBK 的表。没有任何版本的 TiCDC 支持将 charset=GBK 的表复制到早于 v6.1.0 的 TiDB 集群。

  • 早于 v5.4.0 版本的 Backup & Restore(BR)不支持恢复 charset=GBK 的表。没有任何版本的 BR 支持将 charset=GBK 的表恢复到早于 v5.4.0 的 TiDB 集群。

相关链接

文档内容是否有帮助?