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'); e4b88061INSERT INTO gbk_table values('一a');Incorrect Error | SELECT HEX('一a'); e4b88061INSERT INTO gbk_table VALUES('一a');SELECT HEX(a) FROM gbk_table;e4b8 |
| TiDB | SELECT HEX('一a'); Incorrect ErrorINSERT INTO gbk_table VALUES('一a');Incorrect Error | SELECT HEX('一a'); e4b83fINSERT 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 Data Migration (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 集群。