From 84c82fa11991a12ba4f385b784d04aaa9ead750e Mon Sep 17 00:00:00 2001 From: cbcwestwolf <1004626265@qq.com> Date: Sat, 14 Sep 2024 11:03:13 +0800 Subject: [PATCH 1/9] tidb: add description about GB18030 --- TOC.md | 1 + br/backup-and-restore-overview.md | 1 + character-set-and-collation.md | 41 +++++++----- character-set-gb18030.md | 65 +++++++++++++++++++ character-set-gbk.md | 10 +-- dm/dm-best-practices.md | 3 +- dm/dm-overview.md | 4 +- .../information-schema-character-sets.md | 3 +- migrate-from-mariadb.md | 6 +- mysql-compatibility.md | 4 +- sql-statements/sql-statement-import-into.md | 2 +- .../sql-statement-show-collation.md | 29 +++++---- 12 files changed, 122 insertions(+), 47 deletions(-) create mode 100644 character-set-gb18030.md diff --git a/TOC.md b/TOC.md index 9ce73db0c119..dd95e131eb00 100644 --- a/TOC.md +++ b/TOC.md @@ -955,6 +955,7 @@ - 字符集和排序规则 - [概述](/character-set-and-collation.md) - [GBK](/character-set-gbk.md) + - [GB18030](/character-set-gb18030.md) - [Placement Rules in SQL](/placement-rules-in-sql.md) - 系统表 - `mysql` Schema diff --git a/br/backup-and-restore-overview.md b/br/backup-and-restore-overview.md index 4f8ad243cd58..be07b65eaed9 100644 --- a/br/backup-and-restore-overview.md +++ b/br/backup-and-restore-overview.md @@ -115,6 +115,7 @@ TiDB 支持将数据备份到 Amazon S3、Google Cloud Storage (GCS)、Azure Blo | 功能 | 相关 issue | 解决方式 | | ---- | ---- | ----- | |GBK charset|| BR 在 v5.4.0 之前不支持恢复 `charset=GBK` 的表。并且,任何版本的 BR 都不支持恢复 `charset=GBK` 的表到 v5.4.0 之前的 TiDB 集群。| +|GB18030 charset|| BR 在 v8.4.0 之前不支持恢复 `charset=GB18030` 的表。并且,任何版本的 BR 都不支持恢复 `charset=GB18030` 的表到 v8.4.0 之前的 TiDB 集群。| | 聚簇索引 | [#565](https://github.com/pingcap/br/issues/565) | 确保恢复时集群的 `tidb_enable_clustered_index` 全局变量和备份时一致,否则会导致数据不一致的问题,例如 `default not found` 和数据索引不一致。 | | New collation | [#352](https://github.com/pingcap/br/issues/352) | 确保恢复时集群的 `mysql.tidb` 表中 `new_collation_enabled` 变量值和备份时的一致,否则会导致数据索引不一致和 checksum 通不过。更多信息,请参考 [FAQ - BR 为什么会报 `new_collations_enabled_on_first_bootstrap` 不匹配?](/faq/backup-and-restore-faq.md#恢复时为什么会报-new_collation_enabled-不匹配)。 | | 全局临时表 | | 确保使用 BR v5.3.0 及以上版本进行备份和恢复,否则会导致全局临时表的表定义错误。 | diff --git a/character-set-and-collation.md b/character-set-and-collation.md index 1465fc52a659..caa10b04fb17 100644 --- a/character-set-and-collation.md +++ b/character-set-and-collation.md @@ -1,7 +1,7 @@ --- title: 字符集和排序规则 aliases: ['/docs-cn/dev/character-set-and-collation/','/docs-cn/dev/reference/sql/characterset-and-collation/','/docs-cn/dev/reference/sql/character-set/'] -summary: TiDB 支持的字符集包括 ascii、binary、gbk、latin1、utf8 和 utf8mb4。排序规则包括 ascii_bin、binary、gbk_bin、gbk_chinese_ci、latin1_bin、utf8_bin、utf8_general_ci、utf8_unicode_ci、utf8mb4_0900_ai_ci、utf8mb4_0900_bin、utf8mb4_bin、utf8mb4_general_ci 和 utf8mb4_unicode_ci。TiDB 强烈建议使用 utf8mb4 字符集,因为它支持更多字符。在 TiDB 中,默认的排序规则受到客户端的连接排序规则设置的影响。如果客户端使用 utf8mb4_0900_ai_ci 作为连接排序规则,TiDB 将遵循客户端的配置。TiDB 还支持新的排序规则框架,用于在语义上支持不同的排序规则。 +summary: TiDB 支持的字符集包括 ascii、binary、gbk、gb18030、latin1、utf8 和 utf8mb4。排序规则包括 ascii_bin、binary、gbk_bin、gbk_chinese_ci、gb18030_bin、gb18030_chinese_ci、latin1_bin、utf8_bin、utf8_general_ci、utf8_unicode_ci、utf8mb4_0900_ai_ci、utf8mb4_0900_bin、utf8mb4_bin、utf8mb4_general_ci 和 utf8mb4_unicode_ci。TiDB 强烈建议使用 utf8mb4 字符集,因为它支持更多字符。在 TiDB 中,默认的排序规则受到客户端的连接排序规则设置的影响。如果客户端使用 utf8mb4_0900_ai_ci 作为连接排序规则,TiDB 将遵循客户端的配置。TiDB 还支持新的排序规则框架,用于在语义上支持不同的排序规则。 --- # 字符集和排序规则 @@ -98,18 +98,19 @@ SELECT SHOW CHARACTER SET; ``` -``` -+---------+-------------------------------------+-------------------+--------+ -| Charset | Description | Default collation | Maxlen | -+---------+-------------------------------------+-------------------+--------+ -| ascii | US ASCII | ascii_bin | 1 | -| binary | binary | binary | 1 | -| gbk | Chinese Internal Code Specification | gbk_bin | 2 | -| latin1 | Latin1 | latin1_bin | 1 | -| utf8 | UTF-8 Unicode | utf8_bin | 3 | -| utf8mb4 | UTF-8 Unicode | utf8mb4_bin | 4 | -+---------+-------------------------------------+-------------------+--------+ -6 rows in set (0.00 sec) +```sql ++---------+-------------------------------------+--------------------+--------+ +| Charset | Description | Default collation | Maxlen | ++---------+-------------------------------------+--------------------+--------+ +| ascii | US ASCII | ascii_bin | 1 | +| binary | binary | binary | 1 | +| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 | +| gbk | Chinese Internal Code Specification | gbk_chinese_ci | 2 | +| latin1 | Latin1 | latin1_bin | 1 | +| utf8 | UTF-8 Unicode | utf8_bin | 3 | +| utf8mb4 | UTF-8 Unicode | utf8mb4_bin | 4 | ++---------+-------------------------------------+--------------------+--------+ +7 rows in set (0.000 sec) ``` TiDB 支持以下排序规则: @@ -118,12 +119,14 @@ TiDB 支持以下排序规则: SHOW COLLATION; ``` -``` +```sql +--------------------+---------+-----+---------+----------+---------+---------------+ | Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | +--------------------+---------+-----+---------+----------+---------+---------------+ | ascii_bin | ascii | 65 | Yes | Yes | 1 | PAD SPACE | | binary | binary | 63 | Yes | Yes | 1 | NO PAD | +| gb18030_bin | gb18030 | 249 | | Yes | 1 | PAD SPACE | +| gb18030_chinese_ci | gb18030 | 248 | Yes | Yes | 1 | PAD SPACE | | gbk_bin | gbk | 87 | | Yes | 1 | PAD SPACE | | gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 | PAD SPACE | | latin1_bin | latin1 | 47 | Yes | Yes | 1 | PAD SPACE | @@ -136,7 +139,7 @@ SHOW COLLATION; | utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 | PAD SPACE | | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 | PAD SPACE | +--------------------+---------+-----+---------+----------+---------+---------------+ -13 rows in set (0.00 sec) +15 rows in set (0.000 sec) ``` > **警告:** @@ -170,7 +173,7 @@ SHOW COLLATION WHERE Charset = 'utf8mb4'; 5 rows in set (0.00 sec) ``` -TiDB 对 GBK 字符集的支持详情见 [GBK](/character-set-gbk.md)。 +TiDB 对 GBK 字符集的支持详情见 [GBK](/character-set-gbk.md),对 GB18030 字符集的支持详情见 [GB18030](/character-set-gb18030.md)。 ## TiDB 中的 `utf8` 和 `utf8mb4` @@ -519,9 +522,11 @@ SELECT VARIABLE_VALUE FROM mysql.tidb WHERE VARIABLE_NAME='new_collation_enabled 1 row in set (0.00 sec) ``` -在新的排序规则框架下,TiDB 能够支持 `utf8_general_ci`、`utf8mb4_general_ci`、`utf8_unicode_ci`、`utf8mb4_unicode_ci`、`utf8mb4_0900_bin`、`utf8mb4_0900_ai_ci`、`gbk_chinese_ci` 和 `gbk_bin` 这几种排序规则,与 MySQL 兼容。 +在新的排序规则框架下,TiDB 能够支持 `utf8_general_ci`、`utf8mb4_general_ci`、`utf8_unicode_ci`、`utf8mb4_unicode_ci`、`utf8mb4_0900_bin`、`utf8mb4_0900_ai_ci`、`gbk_chinese_ci`、`gbk_bin`、`gb18030_chinese_ci` 和 `gb18030_bin` 这几种排序规则,与 MySQL 兼容。 + +使用 `utf8_general_ci`、`utf8mb4_general_ci`、`utf8_unicode_ci`、`utf8mb4_unicode_ci`、`utf8mb4_0900_ai_ci`、`gbk_chinese_ci` 和 `gb18030_chinese_ci` 中任一种时,字符串之间的比较是大小写不敏感 (case-insensitive) 和口音不敏感 (accent-insensitive) 的。同时,TiDB 还修正了排序规则的 `PADDING` 行为: -使用 `utf8_general_ci`、`utf8mb4_general_ci`、`utf8_unicode_ci`、`utf8mb4_unicode_ci`、`utf8mb4_0900_ai_ci` 和 `gbk_chinese_ci` 中任一种时,字符串之间的比较是大小写不敏感 (case-insensitive) 和口音不敏感 (accent-insensitive) 的。同时,TiDB 还修正了排序规则的 `PADDING` 行为: +{{< copyable "sql" >}} ```sql CREATE TABLE t(a varchar(20) charset utf8mb4 collate utf8mb4_general_ci PRIMARY KEY); diff --git a/character-set-gb18030.md b/character-set-gb18030.md new file mode 100644 index 000000000000..fd7458eece7f --- /dev/null +++ b/character-set-gb18030.md @@ -0,0 +1,65 @@ +--- +title: GB18030 +summary: 本文介绍 TiDB 对 GB18030 字符集的支持情况。 +--- + +# GB18030 + +TiDB 从 v8.4.0 开始支持 GB18030 字符集。本文档介绍 TiDB 对 GB18030 字符集的支持和兼容情况。 + +```sql +SHOW CHARACTER SET WHERE CHARSET = 'gb18030'; ++---------+---------------------------------+--------------------+--------+ +| Charset | Description | Default collation | Maxlen | ++---------+---------------------------------+--------------------+--------+ +| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 | ++---------+---------------------------------+--------------------+--------+ +1 row in set (0.01 sec) + +SHOW COLLATION WHERE CHARSET = 'gb18030'; ++-------------+---------+-----+---------+----------+---------+---------------+ +| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | ++-------------+---------+-----+---------+----------+---------+---------------+ +| gb18030_bin | gb18030 | 249 | Yes | Yes | 1 | PAD SPACE | ++-------------+---------+-----+---------+----------+---------+---------------+ +1 row in set (0.00 sec) +``` + +## 与 MySQL 的兼容性 + +本节介绍 TiDB 中 GB18030 字符集与 MySQL 的兼容情况。 + +### 排序规则兼容性 + +MySQL 的字符集默认排序规则是 `gb18030_chinese_ci`。与 MySQL 不同,TiDB GB18030 字符集的默认排序规则为 `gb18030_bin`。另外,TiDB 支持的 `gb18030_bin` 与 MySQL 支持的 `gb18030_bin` 排序规则也不一致,TiDB 是将 GB18030 转换成 UTF8MB4 然后做二进制排序。 + +如果要使 TiDB 兼容 MySQL 的 GB18030 字符集排序规则,你需要在初次初始化 TiDB 集群时设置 TiDB 配置项[`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `true` 来开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。 + +开启新的排序规则框架后,如果查看 GB18030 字符集对应的排序规则,你可以看到 TiDB GB18030 默认排序规则已经切换为 `gb18030_chinese_ci`。 + +```sql +SHOW CHARACTER SET WHERE CHARSET = 'gb18030'; ++---------+---------------------------------+--------------------+--------+ +| Charset | Description | Default collation | Maxlen | ++---------+---------------------------------+--------------------+--------+ +| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 | ++---------+---------------------------------+--------------------+--------+ +1 row in set (0.01 sec) + +SHOW COLLATION WHERE CHARSET = 'gb18030'; ++--------------------+---------+-----+---------+----------+---------+---------------+ +| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | ++--------------------+---------+-----+---------+----------+---------+---------------+ +| gb18030_bin | gb18030 | 249 | | Yes | 1 | PAD SPACE | +| gb18030_chinese_ci | gb18030 | 248 | Yes | Yes | 1 | PAD SPACE | ++--------------------+---------+-----+---------+----------+---------+---------------+ +2 rows in set (0.00 sec) +``` + +### 非法字符兼容性 + +* 在系统变量 [`character_set_client`](/system-variables.md#character_set_client) 和 [`character_set_connection`](/system-variables.md#character_set_connection) 不同时设置为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 一致。 +* 在 `character_set_client` 和 `character_set_connection` 同时为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 有所区别。 + + - MySQL 处理非法 GB18030 字符集时,对读和写操作的处理方式不同。 + - TiDB 处理非法 GB18030 字符集时,对读和写操作的处理方式相同。TiDB 在严格模式下读写非法 GB18030 字符都会报错,在非严格模式下,读写非法 GB18030 字符都会用 `?` 替换。 diff --git a/character-set-gbk.md b/character-set-gbk.md index 7fae9e1b8c9f..e4e572823ba6 100644 --- a/character-set-gbk.md +++ b/character-set-gbk.md @@ -22,16 +22,13 @@ SHOW CHARACTER SET WHERE CHARSET = 'gbk'; ```sql 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) +2 rows in set (0.001 sec) ``` ## 与 MySQL 的兼容性 @@ -61,16 +58,13 @@ SHOW CHARACTER SET WHERE CHARSET = 'gbk'; ```sql 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) +2 rows in set (0.001 sec) ``` ### 非法字符兼容性 diff --git a/dm/dm-best-practices.md b/dm/dm-best-practices.md index a3d2fd6603df..cbff6fb6119b 100644 --- a/dm/dm-best-practices.md +++ b/dm/dm-best-practices.md @@ -117,10 +117,11 @@ DM 默认会使用悲观 DDL 锁模式。在分库分表迁移与同步场景中 TiDB 默认使用的字符集为 utf8mb4。建议同步上下游及应用统一使用 utf8mb4。如果上游有显式指定的字符集或者排序规则,需要确认 TiDB 是否支持。 -从 v6.0.0 起,TiDB 支持 GBK 字符集。有关字符集的限制详见: +从 v6.0.0 起,TiDB 支持 GBK 字符集;自 v8.4.0 起,TiDB 支持 GB18030 字符集。有关字符集的限制详见: - [字符集和排序规则](/character-set-and-collation.md) - [GBK 兼容情况](/character-set-gbk.md#与-mysql-的兼容性) +- [GB18030 兼容情况](/character-set-gb18030.md#与-mysql-的兼容性) ### 实施侧要点 diff --git a/dm/dm-overview.md b/dm/dm-overview.md index 8219229cb344..c10b5ce92b4d 100644 --- a/dm/dm-overview.md +++ b/dm/dm-overview.md @@ -52,9 +52,9 @@ tiup install dm dmctl - DM 不会将视图的 DDL 语句同步到下游的 TiDB 集群,也不会将针对视图的 DML 语句同步到下游。在该场景下,建议用户在下游 TiDB 集群中自行创建视图。 -+ GBK 字符集兼容性限制 ++ GBK/GB18030 字符集兼容性限制 - - DM 在 v5.4.0 之前不支持将 `charset=GBK` 的表迁移到 TiDB。 + - DM 在 v5.4.0 之前不支持将 `charset=GBK` 的表迁移到 TiDB;在 v8.4.0 之前不支持将 `charset=GB18030` 的表迁移到 TiDB。 + Binlog 兼容性限制 diff --git a/information-schema/information-schema-character-sets.md b/information-schema/information-schema-character-sets.md index 2f92cd4ad367..20574e3e4b70 100644 --- a/information-schema/information-schema-character-sets.md +++ b/information-schema/information-schema-character-sets.md @@ -40,12 +40,13 @@ SELECT * FROM `CHARACTER_SETS`; +--------------------+----------------------+-------------------------------------+--------+ | ascii | ascii_bin | US ASCII | 1 | | binary | binary | binary | 1 | +| gb18030 | gb18030_chinese_ci | China National Standard GB18030 | 4 | | gbk | gbk_chinese_ci | Chinese Internal Code Specification | 2 | | latin1 | latin1_bin | Latin1 | 1 | | utf8 | utf8_bin | UTF-8 Unicode | 3 | | utf8mb4 | utf8mb4_bin | UTF-8 Unicode | 4 | +--------------------+----------------------+-------------------------------------+--------+ -6 rows in set (0.00 sec) +7 rows in set (0.00 sec) ``` `CHARACTER_SETS` 表中列的含义如下: diff --git a/migrate-from-mariadb.md b/migrate-from-mariadb.md index 7826ae0f58c4..234b4b0f453b 100644 --- a/migrate-from-mariadb.md +++ b/migrate-from-mariadb.md @@ -192,12 +192,14 @@ TiDB 不支持 MariaDB 中常用的 `latin1_swedish_ci` 排序规则。 SHOW COLLATION; ``` -``` +```sql +--------------------+---------+-----+---------+----------+---------+---------------+ | Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | +--------------------+---------+-----+---------+----------+---------+---------------+ | ascii_bin | ascii | 65 | Yes | Yes | 1 | PAD SPACE | | binary | binary | 63 | Yes | Yes | 1 | NO PAD | +| gb18030_bin | gb18030 | 249 | | Yes | 1 | PAD SPACE | +| gb18030_chinese_ci | gb18030 | 248 | Yes | Yes | 1 | PAD SPACE | | gbk_bin | gbk | 87 | | Yes | 1 | PAD SPACE | | gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 | PAD SPACE | | latin1_bin | latin1 | 47 | Yes | Yes | 1 | PAD SPACE | @@ -210,7 +212,7 @@ SHOW COLLATION; | utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 | PAD SPACE | | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 | PAD SPACE | +--------------------+---------+-----+---------+----------+---------+---------------+ -13 rows in set (0.00 sec) +15 rows in set (0.000 sec) ``` 执行下列语句检查当前表的列使用的排序规则: diff --git a/mysql-compatibility.md b/mysql-compatibility.md index c2e1b349d921..20fd25189a0b 100644 --- a/mysql-compatibility.md +++ b/mysql-compatibility.md @@ -31,7 +31,7 @@ TiDB 高度兼容 MySQL 协议,以及 MySQL 5.7 和 MySQL 8.0 常用的功能 * 自定义函数 * 全文语法与索引 [#1793](https://github.com/pingcap/tidb/issues/1793) * 空间类型的函数(即 `GIS`/`GEOMETRY`)、数据类型和索引 [#6347](https://github.com/pingcap/tidb/issues/6347) -* 非 `ascii`、`latin1`、`binary`、`utf8`、`utf8mb4`、`gbk` 的字符集 +* 非 `ascii`、`latin1`、`binary`、`utf8`、`utf8mb4`、`gbk`、`gb18030` 的字符集 * MySQL 追踪优化器 * XML 函数 * X-Protocol [#1109](https://github.com/pingcap/tidb/issues/1109) @@ -166,6 +166,8 @@ TiDB 中的视图不可更新,不支持 `UPDATE`、`INSERT`、`DELETE` 等写 * 关于 GBK 字符集与 MySQL 的兼容情况,详见 [GBK 兼容情况](/character-set-gbk.md#与-mysql-的兼容性)。 +* 关于 GB18030 字符集与 MySQL 的兼容情况,详见 [GB18030 兼容情况](/character-set-gb18030.md#与-mysql-的兼容性)。 + * TiDB 继承表中使用的字符集作为国家字符集。 ### 存储引擎 diff --git a/sql-statements/sql-statement-import-into.md b/sql-statements/sql-statement-import-into.md index 8a8fc751447f..64c5d5066524 100644 --- a/sql-statements/sql-statement-import-into.md +++ b/sql-statements/sql-statement-import-into.md @@ -136,7 +136,7 @@ SET 表达式左侧只能引用 `ColumnNameOrUserVarList` 中没有的列名。 | 选项名 | 支持的数据源以及格式 | 描述 | |:---|:---|:---| -| `CHARACTER_SET=''` | CSV | 指定数据文件的字符集,默认为 `utf8mb4`。目前支持的字符集包括 `binary`、`utf8`、`utf8mb4`、`gb18030`、`gbk`、`latin1` 和 `ascii`。 | +| `CHARACTER_SET=''` | CSV | 指定数据文件的字符集,默认为 `utf8mb4`。目前支持的字符集包括 `binary`、`utf8`、`utf8mb4`、`gb18030`、`gbk`、`gb18030`、`latin1` 和 `ascii`。 | | `FIELDS_TERMINATED_BY=''` | CSV | 指定字段分隔符,默认为 `,`。 | | `FIELDS_ENCLOSED_BY=''` | CSV | 指定字段的定界符,默认为 `"`。 | | `FIELDS_ESCAPED_BY=''` | CSV | 指定字段的转义符,默认为 `\`。 | diff --git a/sql-statements/sql-statement-show-collation.md b/sql-statements/sql-statement-show-collation.md index 8a9a1512569e..2758e7f0c30b 100644 --- a/sql-statements/sql-statement-show-collation.md +++ b/sql-statements/sql-statement-show-collation.md @@ -31,12 +31,14 @@ ShowLikeOrWhere ::= SHOW COLLATION; ``` -``` +```sql +--------------------+---------+-----+---------+----------+---------+---------------+ | Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | +--------------------+---------+-----+---------+----------+---------+---------------+ | ascii_bin | ascii | 65 | Yes | Yes | 1 | PAD SPACE | | binary | binary | 63 | Yes | Yes | 1 | NO PAD | +| gb18030_bin | gb18030 | 249 | | Yes | 1 | PAD SPACE | +| gb18030_chinese_ci | gb18030 | 248 | Yes | Yes | 1 | PAD SPACE | | gbk_bin | gbk | 87 | | Yes | 1 | PAD SPACE | | gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 | PAD SPACE | | latin1_bin | latin1 | 47 | Yes | Yes | 1 | PAD SPACE | @@ -49,7 +51,7 @@ SHOW COLLATION; | utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 | PAD SPACE | | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 | PAD SPACE | +--------------------+---------+-----+---------+----------+---------+---------------+ -13 rows in set (0.00 sec) +15 rows in set (0.000 sec) ``` 若未开启新排序规则框架,仅展示二进制排序规则: @@ -59,17 +61,18 @@ SHOW COLLATION; ``` ```sql -+-------------+---------+----+---------+----------+---------+---------------+ -| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | -+-------------+---------+----+---------+----------+---------+---------------+ -| utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 | PAD SPACE | -| latin1_bin | latin1 | 47 | Yes | Yes | 1 | PAD SPACE | -| binary | binary | 63 | Yes | Yes | 1 | NO PAD | -| ascii_bin | ascii | 65 | Yes | Yes | 1 | PAD SPACE | -| utf8_bin | utf8 | 83 | Yes | Yes | 1 | PAD SPACE | -| gbk_bin | gbk | 87 | Yes | Yes | 1 | PAD SPACE | -+-------------+---------+----+---------+----------+---------+---------------+ -6 rows in set (0.00 sec) ++-------------+---------+-----+---------+----------+---------+---------------+ +| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | ++-------------+---------+-----+---------+----------+---------+---------------+ +| utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 | PAD SPACE | +| latin1_bin | latin1 | 47 | Yes | Yes | 1 | PAD SPACE | +| binary | binary | 63 | Yes | Yes | 1 | NO PAD | +| ascii_bin | ascii | 65 | Yes | Yes | 1 | PAD SPACE | +| utf8_bin | utf8 | 83 | Yes | Yes | 1 | PAD SPACE | +| gbk_bin | gbk | 87 | Yes | Yes | 1 | PAD SPACE | +| gb18030_bin | gb18030 | 249 | Yes | Yes | 1 | PAD SPACE | ++-------------+---------+-----+---------+----------+---------+---------------+ +7 rows in set (0.000 sec) ``` 要过滤字符集,可以添加 `WHERE` 子句。 From 79d7744343e66ed1ffd0b254473b78b0854692b4 Mon Sep 17 00:00:00 2001 From: cbcwestwolf <1004626265@qq.com> Date: Mon, 23 Sep 2024 14:01:29 +0800 Subject: [PATCH 2/9] update --- .../sql-statement-show-collation.md | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/sql-statements/sql-statement-show-collation.md b/sql-statements/sql-statement-show-collation.md index 2758e7f0c30b..b433e9ea1748 100644 --- a/sql-statements/sql-statement-show-collation.md +++ b/sql-statements/sql-statement-show-collation.md @@ -25,7 +25,28 @@ ShowLikeOrWhere ::= ## 示例 -如果启用了[新排序规则框架](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap)(默认启用),输出如下: +若未开启新排序规则框架,仅展示二进制排序规则: + +```sql +SHOW COLLATION; +``` + +```sql ++-------------+---------+-----+---------+----------+---------+---------------+ +| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | ++-------------+---------+-----+---------+----------+---------+---------------+ +| utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 | PAD SPACE | +| latin1_bin | latin1 | 47 | Yes | Yes | 1 | PAD SPACE | +| binary | binary | 63 | Yes | Yes | 1 | NO PAD | +| ascii_bin | ascii | 65 | Yes | Yes | 1 | PAD SPACE | +| utf8_bin | utf8 | 83 | Yes | Yes | 1 | PAD SPACE | +| gbk_bin | gbk | 87 | Yes | Yes | 1 | PAD SPACE | +| gb18030_bin | gb18030 | 249 | Yes | Yes | 1 | PAD SPACE | ++-------------+---------+-----+---------+----------+---------+---------------+ +7 rows in set (0.00 sec) +``` + +若开启了新排序规则框架,则在二进制排序规则之外,额外支持若干种大小写和口音不敏感的排序规则: ```sql SHOW COLLATION; From 7d3f2c45c55e2d06af5538b324694a5a26bb1f87 Mon Sep 17 00:00:00 2001 From: CbcWestwolf <1004626265@qq.com> Date: Tue, 24 Sep 2024 13:44:37 +0800 Subject: [PATCH 3/9] Apply suggestions from code review Co-authored-by: xixirangrang --- character-set-gb18030.md | 6 +++--- dm/dm-best-practices.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/character-set-gb18030.md b/character-set-gb18030.md index fd7458eece7f..5efb4e630a14 100644 --- a/character-set-gb18030.md +++ b/character-set-gb18030.md @@ -33,7 +33,7 @@ SHOW COLLATION WHERE CHARSET = 'gb18030'; MySQL 的字符集默认排序规则是 `gb18030_chinese_ci`。与 MySQL 不同,TiDB GB18030 字符集的默认排序规则为 `gb18030_bin`。另外,TiDB 支持的 `gb18030_bin` 与 MySQL 支持的 `gb18030_bin` 排序规则也不一致,TiDB 是将 GB18030 转换成 UTF8MB4 然后做二进制排序。 -如果要使 TiDB 兼容 MySQL 的 GB18030 字符集排序规则,你需要在初次初始化 TiDB 集群时设置 TiDB 配置项[`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `true` 来开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。 +如果要使 TiDB 兼容 MySQL 的 GB18030 字符集排序规则,你需要在初次初始化 TiDB 集群时设置 TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `true` 来开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。 开启新的排序规则框架后,如果查看 GB18030 字符集对应的排序规则,你可以看到 TiDB GB18030 默认排序规则已经切换为 `gb18030_chinese_ci`。 @@ -58,8 +58,8 @@ SHOW COLLATION WHERE CHARSET = 'gb18030'; ### 非法字符兼容性 -* 在系统变量 [`character_set_client`](/system-variables.md#character_set_client) 和 [`character_set_connection`](/system-variables.md#character_set_connection) 不同时设置为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 一致。 -* 在 `character_set_client` 和 `character_set_connection` 同时为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 有所区别。 +* 在系统变量 [`character_set_client`](/system-variables.md#character_set_client) 和 [`character_set_connection`](/system-variables.md#character_set_connection) 没有同时设置为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 一致。 +* 在 `character_set_client` 和 `character_set_connection` 同时为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 有如下区别: - MySQL 处理非法 GB18030 字符集时,对读和写操作的处理方式不同。 - TiDB 处理非法 GB18030 字符集时,对读和写操作的处理方式相同。TiDB 在严格模式下读写非法 GB18030 字符都会报错,在非严格模式下,读写非法 GB18030 字符都会用 `?` 替换。 diff --git a/dm/dm-best-practices.md b/dm/dm-best-practices.md index cbff6fb6119b..b93032754f31 100644 --- a/dm/dm-best-practices.md +++ b/dm/dm-best-practices.md @@ -117,7 +117,7 @@ DM 默认会使用悲观 DDL 锁模式。在分库分表迁移与同步场景中 TiDB 默认使用的字符集为 utf8mb4。建议同步上下游及应用统一使用 utf8mb4。如果上游有显式指定的字符集或者排序规则,需要确认 TiDB 是否支持。 -从 v6.0.0 起,TiDB 支持 GBK 字符集;自 v8.4.0 起,TiDB 支持 GB18030 字符集。有关字符集的限制详见: +从 v6.0.0 起,TiDB 支持 GBK 字符集;从 v8.4.0 起,TiDB 支持 GB18030 字符集。有关字符集的限制详见: - [字符集和排序规则](/character-set-and-collation.md) - [GBK 兼容情况](/character-set-gbk.md#与-mysql-的兼容性) From faec9f3597930580210026ceff35e6727e736789 Mon Sep 17 00:00:00 2001 From: Lilian Lee Date: Tue, 24 Sep 2024 15:24:44 +0800 Subject: [PATCH 4/9] Update wording and punctuation --- character-set-gb18030.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/character-set-gb18030.md b/character-set-gb18030.md index 5efb4e630a14..a7aae3aecf24 100644 --- a/character-set-gb18030.md +++ b/character-set-gb18030.md @@ -35,7 +35,7 @@ MySQL 的字符集默认排序规则是 `gb18030_chinese_ci`。与 MySQL 不同 如果要使 TiDB 兼容 MySQL 的 GB18030 字符集排序规则,你需要在初次初始化 TiDB 集群时设置 TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `true` 来开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。 -开启新的排序规则框架后,如果查看 GB18030 字符集对应的排序规则,你可以看到 TiDB GB18030 默认排序规则已经切换为 `gb18030_chinese_ci`。 +开启新的排序规则框架后,查看 GB18030 字符集对应的排序规则,可以看到 TiDB GB18030 默认排序规则已经切换为 `gb18030_chinese_ci`。 ```sql SHOW CHARACTER SET WHERE CHARSET = 'gb18030'; @@ -59,7 +59,7 @@ SHOW COLLATION WHERE CHARSET = 'gb18030'; ### 非法字符兼容性 * 在系统变量 [`character_set_client`](/system-variables.md#character_set_client) 和 [`character_set_connection`](/system-variables.md#character_set_connection) 没有同时设置为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 一致。 -* 在 `character_set_client` 和 `character_set_connection` 同时为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 有如下区别: +* 在 `character_set_client` 和 `character_set_connection` 同时设置为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 有如下区别: - MySQL 处理非法 GB18030 字符集时,对读和写操作的处理方式不同。 - - TiDB 处理非法 GB18030 字符集时,对读和写操作的处理方式相同。TiDB 在严格模式下读写非法 GB18030 字符都会报错,在非严格模式下,读写非法 GB18030 字符都会用 `?` 替换。 + - TiDB 处理非法 GB18030 字符集时,对读和写操作的处理方式相同。TiDB 在严格模式下读写非法 GB18030 字符都会报错;在非严格模式下,读写非法 GB18030 字符都会用 `?` 替换。 From 713de8c2ff6f829932f338a2c626377599d22849 Mon Sep 17 00:00:00 2001 From: CbcWestwolf <1004626265@qq.com> Date: Wed, 25 Sep 2024 10:31:12 +0800 Subject: [PATCH 5/9] Apply suggestions from code review Co-authored-by: Lilian Lee --- character-set-gb18030.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/character-set-gb18030.md b/character-set-gb18030.md index a7aae3aecf24..3388f7144a68 100644 --- a/character-set-gb18030.md +++ b/character-set-gb18030.md @@ -31,9 +31,9 @@ SHOW COLLATION WHERE CHARSET = 'gb18030'; ### 排序规则兼容性 -MySQL 的字符集默认排序规则是 `gb18030_chinese_ci`。与 MySQL 不同,TiDB GB18030 字符集的默认排序规则为 `gb18030_bin`。另外,TiDB 支持的 `gb18030_bin` 与 MySQL 支持的 `gb18030_bin` 排序规则也不一致,TiDB 是将 GB18030 转换成 UTF8MB4 然后做二进制排序。 +MySQL `gb18030` 字符集的默认排序规则是 `gb18030_chinese_ci`;而 TiDB `gb18030` 字符集的默认排序规则为 `gb18030_bin`。此外,TiDB 支持的 `gb18030_bin` 与 MySQL 支持的 `gb18030_bin` 排序规则也不一致,TiDB 是将 `gb18030` 字符集转换成 `utf8mb4` 然后做二进制排序。 -如果要使 TiDB 兼容 MySQL 的 GB18030 字符集排序规则,你需要在初次初始化 TiDB 集群时设置 TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `true` 来开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。 +如果要使 TiDB 兼容 MySQL GB18030 字符集的排序规则,你需要在首次初始化 TiDB 集群时将 TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 设置为 `true` 来开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。 开启新的排序规则框架后,查看 GB18030 字符集对应的排序规则,可以看到 TiDB GB18030 默认排序规则已经切换为 `gb18030_chinese_ci`。 From 0cfb69040c01a7cc3c93cbd49cd28ad064422eb2 Mon Sep 17 00:00:00 2001 From: cbcwestwolf <1004626265@qq.com> Date: Wed, 25 Sep 2024 10:41:02 +0800 Subject: [PATCH 6/9] update --- sql-statements/sql-statement-show-collation.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sql-statements/sql-statement-show-collation.md b/sql-statements/sql-statement-show-collation.md index b433e9ea1748..657c168ba6f0 100644 --- a/sql-statements/sql-statement-show-collation.md +++ b/sql-statements/sql-statement-show-collation.md @@ -46,7 +46,10 @@ SHOW COLLATION; 7 rows in set (0.00 sec) ``` -若开启了新排序规则框架,则在二进制排序规则之外,额外支持若干种大小写和口音不敏感的排序规则: +若开启了新排序规则框架,则在二进制排序规则之外,额外支持以下排序规则: + +* 7 种大小写和口音不敏感的排序规则,以 `_ci` 结尾 +* `utf8mb4_0900_bin` ```sql SHOW COLLATION; From fc4510805888db6c6c0d4ef51faded32bdd911eb Mon Sep 17 00:00:00 2001 From: cbcwestwolf <1004626265@qq.com> Date: Mon, 6 Jan 2025 11:27:34 +0800 Subject: [PATCH 7/9] update version to 9.0; specify the gb18030-2022 charset version --- br/backup-and-restore-overview.md | 2 +- character-set-gb18030.md | 2 +- dm/dm-best-practices.md | 2 +- dm/dm-overview.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/br/backup-and-restore-overview.md b/br/backup-and-restore-overview.md index be07b65eaed9..cc9854587c45 100644 --- a/br/backup-and-restore-overview.md +++ b/br/backup-and-restore-overview.md @@ -115,7 +115,7 @@ TiDB 支持将数据备份到 Amazon S3、Google Cloud Storage (GCS)、Azure Blo | 功能 | 相关 issue | 解决方式 | | ---- | ---- | ----- | |GBK charset|| BR 在 v5.4.0 之前不支持恢复 `charset=GBK` 的表。并且,任何版本的 BR 都不支持恢复 `charset=GBK` 的表到 v5.4.0 之前的 TiDB 集群。| -|GB18030 charset|| BR 在 v8.4.0 之前不支持恢复 `charset=GB18030` 的表。并且,任何版本的 BR 都不支持恢复 `charset=GB18030` 的表到 v8.4.0 之前的 TiDB 集群。| +|GB18030 charset|| BR 在 v9.0.0 之前不支持恢复 `charset=GB18030` 的表。并且,任何版本的 BR 都不支持恢复 `charset=GB18030` 的表到 v9.0.0 之前的 TiDB 集群。| | 聚簇索引 | [#565](https://github.com/pingcap/br/issues/565) | 确保恢复时集群的 `tidb_enable_clustered_index` 全局变量和备份时一致,否则会导致数据不一致的问题,例如 `default not found` 和数据索引不一致。 | | New collation | [#352](https://github.com/pingcap/br/issues/352) | 确保恢复时集群的 `mysql.tidb` 表中 `new_collation_enabled` 变量值和备份时的一致,否则会导致数据索引不一致和 checksum 通不过。更多信息,请参考 [FAQ - BR 为什么会报 `new_collations_enabled_on_first_bootstrap` 不匹配?](/faq/backup-and-restore-faq.md#恢复时为什么会报-new_collation_enabled-不匹配)。 | | 全局临时表 | | 确保使用 BR v5.3.0 及以上版本进行备份和恢复,否则会导致全局临时表的表定义错误。 | diff --git a/character-set-gb18030.md b/character-set-gb18030.md index 3388f7144a68..223a16b7785c 100644 --- a/character-set-gb18030.md +++ b/character-set-gb18030.md @@ -5,7 +5,7 @@ summary: 本文介绍 TiDB 对 GB18030 字符集的支持情况。 # GB18030 -TiDB 从 v8.4.0 开始支持 GB18030 字符集。本文档介绍 TiDB 对 GB18030 字符集的支持和兼容情况。 +TiDB 从 v9.0.0 开始支持 GB18030-2022 字符集。本文档介绍 TiDB 对 GB18030 字符集的支持和兼容情况。 ```sql SHOW CHARACTER SET WHERE CHARSET = 'gb18030'; diff --git a/dm/dm-best-practices.md b/dm/dm-best-practices.md index b93032754f31..c6fc0f3e03da 100644 --- a/dm/dm-best-practices.md +++ b/dm/dm-best-practices.md @@ -117,7 +117,7 @@ DM 默认会使用悲观 DDL 锁模式。在分库分表迁移与同步场景中 TiDB 默认使用的字符集为 utf8mb4。建议同步上下游及应用统一使用 utf8mb4。如果上游有显式指定的字符集或者排序规则,需要确认 TiDB 是否支持。 -从 v6.0.0 起,TiDB 支持 GBK 字符集;从 v8.4.0 起,TiDB 支持 GB18030 字符集。有关字符集的限制详见: +从 v6.0.0 起,TiDB 支持 GBK 字符集;从 v9.0.0 起,TiDB 支持 GB18030 字符集。有关字符集的限制详见: - [字符集和排序规则](/character-set-and-collation.md) - [GBK 兼容情况](/character-set-gbk.md#与-mysql-的兼容性) diff --git a/dm/dm-overview.md b/dm/dm-overview.md index c10b5ce92b4d..65593582b5f8 100644 --- a/dm/dm-overview.md +++ b/dm/dm-overview.md @@ -54,7 +54,7 @@ tiup install dm dmctl + GBK/GB18030 字符集兼容性限制 - - DM 在 v5.4.0 之前不支持将 `charset=GBK` 的表迁移到 TiDB;在 v8.4.0 之前不支持将 `charset=GB18030` 的表迁移到 TiDB。 + - DM 在 v5.4.0 之前不支持将 `charset=GBK` 的表迁移到 TiDB;在 v9.0.0 之前不支持将 `charset=GB18030` 的表迁移到 TiDB。 + Binlog 兼容性限制 From befd78ce7b83b0991bf05dc80b57e9bfba4f0ca5 Mon Sep 17 00:00:00 2001 From: cbcwestwolf <1004626265@qq.com> Date: Mon, 10 Feb 2025 19:20:14 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20"=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E8=A7=84=E5=88=99=E5=85=BC=E5=AE=B9=E6=80=A7"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character-set-gb18030.md | 36 ++++++++++++++++++++++++++++-------- character-set-gbk.md | 10 ++++++++-- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/character-set-gb18030.md b/character-set-gb18030.md index 223a16b7785c..440dcdd8634f 100644 --- a/character-set-gb18030.md +++ b/character-set-gb18030.md @@ -9,20 +9,29 @@ TiDB 从 v9.0.0 开始支持 GB18030-2022 字符集。本文档介绍 TiDB 对 G ```sql SHOW CHARACTER SET WHERE CHARSET = 'gb18030'; +``` + +``` +---------+---------------------------------+--------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+---------------------------------+--------------------+--------+ | gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 | +---------+---------------------------------+--------------------+--------+ 1 row in set (0.01 sec) +``` +```sql SHOW COLLATION WHERE CHARSET = 'gb18030'; -+-------------+---------+-----+---------+----------+---------+---------------+ -| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | -+-------------+---------+-----+---------+----------+---------+---------------+ -| gb18030_bin | gb18030 | 249 | Yes | Yes | 1 | PAD SPACE | -+-------------+---------+-----+---------+----------+---------+---------------+ -1 row in set (0.00 sec) +``` + +``` ++--------------------+---------+-----+---------+----------+---------+---------------+ +| Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | ++--------------------+---------+-----+---------+----------+---------+---------------+ +| gb18030_bin | gb18030 | 249 | | Yes | 1 | PAD SPACE | +| gb18030_chinese_ci | gb18030 | 248 | Yes | Yes | 1 | PAD SPACE | ++--------------------+---------+-----+---------+----------+---------+---------------+ +2 rows in set (0.001 sec) ``` ## 与 MySQL 的兼容性 @@ -31,22 +40,33 @@ SHOW COLLATION WHERE CHARSET = 'gb18030'; ### 排序规则兼容性 -MySQL `gb18030` 字符集的默认排序规则是 `gb18030_chinese_ci`;而 TiDB `gb18030` 字符集的默认排序规则为 `gb18030_bin`。此外,TiDB 支持的 `gb18030_bin` 与 MySQL 支持的 `gb18030_bin` 排序规则也不一致,TiDB 是将 `gb18030` 字符集转换成 `utf8mb4` 然后做二进制排序。 +MySQL 的 GB18030 字符集默认排序规则是 `gb18030_chinese_ci`。TiDB 的 GB18030 字符集的默认排序规则取决于 TiDB 配置项[`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 的值: + +- 默认情况下,TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `true`,表示开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。GB18030 字符集的默认排序规则是 `gb18030_chinese_ci`。 +- 当 TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `false` 时,表示关闭新的排序规则框架,GB18030 字符集的默认排序规则是 `gb18030_bin`。 -如果要使 TiDB 兼容 MySQL GB18030 字符集的排序规则,你需要在首次初始化 TiDB 集群时将 TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 设置为 `true` 来开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。 +另外,TiDB 支持的 `gb18030_bin` 与 MySQL 支持的 `gb18030_bin` 排序规则也不一致,TiDB 是将 GB18030 转换成 `utf8mb4`,然后再进行二进制排序。 开启新的排序规则框架后,查看 GB18030 字符集对应的排序规则,可以看到 TiDB GB18030 默认排序规则已经切换为 `gb18030_chinese_ci`。 ```sql SHOW CHARACTER SET WHERE CHARSET = 'gb18030'; +``` + +``` +---------+---------------------------------+--------------------+--------+ | Charset | Description | Default collation | Maxlen | +---------+---------------------------------+--------------------+--------+ | gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 | +---------+---------------------------------+--------------------+--------+ 1 row in set (0.01 sec) +``` +```sql SHOW COLLATION WHERE CHARSET = 'gb18030'; +``` + +``` +--------------------+---------+-----+---------+----------+---------+---------------+ | Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | +--------------------+---------+-----+---------+----------+---------+---------------+ diff --git a/character-set-gbk.md b/character-set-gbk.md index e4e572823ba6..922f89996a7f 100644 --- a/character-set-gbk.md +++ b/character-set-gbk.md @@ -37,9 +37,12 @@ SHOW COLLATION WHERE CHARSET = 'gbk'; ### 排序规则兼容性 -MySQL 的字符集默认排序规则是 `gbk_chinese_ci`。与 MySQL 不同,TiDB GBK 字符集的默认排序规则为 `gbk_bin`。另外,TiDB 支持的 `gbk_bin` 与 MySQL 支持的 `gbk_bin` 排序规则也不一致,TiDB 是将 GBK 转换成 `utf8mb4`,然后再进行二进制排序。 +MySQL 的 GBK 字符集默认排序规则是 `gbk_chinese_ci`。TiDB 的 GBK 字符集的默认排序规则取决于 TiDB 配置项[`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 的值: -如果要使 TiDB 兼容 MySQL 的 GBK 字符集排序规则,你需要在初次初始化 TiDB 集群时设置 TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `true` 来开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。对于新部署的系统,该设置是默认值。 +- 默认情况下,TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `true`,表示开启[新的排序规则框架](/character-set-and-collation.md#新框架下的排序规则支持)。GBK 字符集的默认排序规则是 `gbk_chinese_ci`。 +- 当 TiDB 配置项 [`new_collations_enabled_on_first_bootstrap`](/tidb-configuration-file.md#new_collations_enabled_on_first_bootstrap) 为 `false` 时,表示关闭新的排序规则框架,GBK 字符集的默认排序规则是 `gbk_bin`。 + +另外,TiDB 支持的 `gbk_bin` 与 MySQL 支持的 `gbk_bin` 排序规则也不一致,TiDB 是将 GBK 转换成 `utf8mb4`,然后再进行二进制排序。 开启新的排序规则框架后,如果查看 GBK 字符集对应的排序规则,你可以看到 TiDB GBK 默认排序规则已经切换为 `gbk_chinese_ci`。 @@ -58,6 +61,9 @@ SHOW CHARACTER SET WHERE CHARSET = 'gbk'; ```sql SHOW COLLATION WHERE CHARSET = 'gbk'; +``` + +``` +----------------+---------+----+---------+----------+---------+---------------+ | Collation | Charset | Id | Default | Compiled | Sortlen | Pad_attribute | +----------------+---------+----+---------+----------+---------+---------------+ From de58e8fb050af77bdd529beacdeadb52b0c3b6d6 Mon Sep 17 00:00:00 2001 From: cbcwestwolf <1004626265@qq.com> Date: Mon, 10 Feb 2025 21:25:04 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20"=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- character-set-gb18030.md | 36 +++++++++++++++++++++++++++++++----- dm/dm-best-practices.md | 3 +-- dm/dm-overview.md | 2 +- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/character-set-gb18030.md b/character-set-gb18030.md index 440dcdd8634f..778bce4b39b1 100644 --- a/character-set-gb18030.md +++ b/character-set-gb18030.md @@ -76,10 +76,36 @@ SHOW COLLATION WHERE CHARSET = 'gb18030'; 2 rows in set (0.00 sec) ``` -### 非法字符兼容性 +### 字符兼容性 -* 在系统变量 [`character_set_client`](/system-variables.md#character_set_client) 和 [`character_set_connection`](/system-variables.md#character_set_connection) 没有同时设置为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 一致。 -* 在 `character_set_client` 和 `character_set_connection` 同时设置为 `gb18030` 的情况下,TiDB 处理非法字符的方式与 MySQL 有如下区别: +- TiDB 支持 GB18030-2022 的字符,MySQL 支持 GB18030-2005 的字符,因此部分字符的编解码结果不同。 - - MySQL 处理非法 GB18030 字符集时,对读和写操作的处理方式不同。 - - TiDB 处理非法 GB18030 字符集时,对读和写操作的处理方式相同。TiDB 在严格模式下读写非法 GB18030 字符都会报错;在非严格模式下,读写非法 GB18030 字符都会用 `?` 替换。 +- 对于非法的 GB18030 字符,比如 `0xFE39FE39`,MySQL 支持以 16 进制的方式写入数据库中,并保存为 `?`;TiDB 在严格模式下读写非法 GB18030 字符都会报错,在非严格模式下,读写非法 GB18030 字符会返回警告。 + +### 其它 + +* 目前 TiDB 不支持通过 `ALTER TABLE` 语句将其它字符集类型改成 `gb18030` 或者从 `gb18030` 转成其它字符集类型。 + +* TiDB 不支持使用 `_gb18030`,比如: + + ```sql + CREATE TABLE t(a CHAR(10) CHARSET BINARY); + Query OK, 0 rows affected (0.00 sec) + INSERT INTO t VALUES (_gb18030'啊'); + ERROR 1115 (42000): Unsupported character introducer: 'gb18030' + ``` + +* 对于 `ENUM` 和 `SET` 类型中的二进制字符,TiDB 目前都会将其作为 `utf8mb4` 字符集处理。 + +## 组件兼容性 + +* TiFlash、TiDB Data Migration (DM) 和 TiCDC 目前不支持 GB18030 字符集。 + +* Dumpling 在 v9.0.0 之前不支持导出 charset=GB18030 的表,TiDB Lightning 在 v9.0.0 之前不支持导入 charset=GB18030 的表。 + +* TiDB Backup & Restore(BR)在 v9.0.0 之前不支持备份恢复 charset=GB18030 的表。另外,任何版本的 BR 都不支持恢复 charset=GB18030 的表到 v9.0.0 之前的平凯数据库集群。 + +## 另请参阅 + +* [`SHOW CHARACTER SET`](/sql-statements/sql-statement-show-character-set.md) +* [字符集和排序规则](/character-set-and-collation.md) diff --git a/dm/dm-best-practices.md b/dm/dm-best-practices.md index c6fc0f3e03da..a3d2fd6603df 100644 --- a/dm/dm-best-practices.md +++ b/dm/dm-best-practices.md @@ -117,11 +117,10 @@ DM 默认会使用悲观 DDL 锁模式。在分库分表迁移与同步场景中 TiDB 默认使用的字符集为 utf8mb4。建议同步上下游及应用统一使用 utf8mb4。如果上游有显式指定的字符集或者排序规则,需要确认 TiDB 是否支持。 -从 v6.0.0 起,TiDB 支持 GBK 字符集;从 v9.0.0 起,TiDB 支持 GB18030 字符集。有关字符集的限制详见: +从 v6.0.0 起,TiDB 支持 GBK 字符集。有关字符集的限制详见: - [字符集和排序规则](/character-set-and-collation.md) - [GBK 兼容情况](/character-set-gbk.md#与-mysql-的兼容性) -- [GB18030 兼容情况](/character-set-gb18030.md#与-mysql-的兼容性) ### 实施侧要点 diff --git a/dm/dm-overview.md b/dm/dm-overview.md index 65593582b5f8..fe08cad0684a 100644 --- a/dm/dm-overview.md +++ b/dm/dm-overview.md @@ -54,7 +54,7 @@ tiup install dm dmctl + GBK/GB18030 字符集兼容性限制 - - DM 在 v5.4.0 之前不支持将 `charset=GBK` 的表迁移到 TiDB;在 v9.0.0 之前不支持将 `charset=GB18030` 的表迁移到 TiDB。 + - DM 在 v5.4.0 之前不支持将 `charset=GBK` 的表迁移到 TiDB;当前 DM 不支持将 `charset=GB18030` 的表迁移到 TiDB。 + Binlog 兼容性限制