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_client
和character_set_connection
没有同时设置为gbk
,TiDB 处理非法字符的方式与 MySQL 相同。如果
character_set_client
和character_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_TABLES 或 STRICT_TRANS_TABLES | 如果配置的 SQL 模式既不包含 STRICT_ALL_TABLES 也不包含 STRICT_TRANS_TABLES |
---|---|---|
MySQL | SELECT 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 |
TiDB | SELECT 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'
- 目前,对于
ENUM
和SET
类型的二进制字符,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 集群。