📣
TiDB Cloud Essential 开放公测中。此页面由 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_TABLESSTRICT_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 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 集群。

参考文档

文档内容是否有帮助?