From 9c5ed5b841eb6e996cfaa8d63a4ca4d8e97ac9b3 Mon Sep 17 00:00:00 2001 From: ireneontheway Date: Tue, 4 Aug 2020 20:44:47 +0800 Subject: [PATCH 1/3] Update character-set-and-collation.md --- character-set-and-collation.md | 88 +++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/character-set-and-collation.md b/character-set-and-collation.md index 2d385c2fb6fc..358e76a9d1c8 100644 --- a/character-set-and-collation.md +++ b/character-set-and-collation.md @@ -9,9 +9,41 @@ aliases: ['/docs-cn/dev/character-set-and-collation/','/docs-cn/dev/reference/sq ## 字符集和排序规则的概念 -字符集 (character set) 是符号与编码的集合。 +字符集 (character set) 是符号与编码的集合。TiDB 中的默认字符集是 utf8mb4,与 MySQL 8.0 及更高版本中的默认字符匹配。 -排序规则 (collation) 是在字符集中比较字符的规则。 +排序规则 (collation) 是在字符集中比较字符以及字符排序顺序的规则。例如,在二进制排序规则中,比较“A”和“a”的结果是不一样的: + +{{< copyable "sql" >}} + +```sql +SET NAMES utf8mb4 COLLATE utf8mb4_bin; +SELECT 'A' = 'a'; +SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +SELECT 'A' = 'a'; +``` + +```sql +mysql> SELECT 'A' = 'a'; ++-----------+ +| 'A' = 'a' | ++-----------+ +| 0 | ++-----------+ +1 row in set (0.00 sec) + +mysql> SET NAMES utf8mb4 COLLATE utf8mb4_general_ci; +Query OK, 0 rows affected (0.00 sec) + +mysql> SELECT 'A' = 'a'; ++-----------+ +| 'A' = 'a' | ++-----------+ +| 1 | ++-----------+ +1 row in set (0.00 sec) +``` + +TiDB 默认使用二进制排序规则。与 MySQL 不同,MySQL 默认使用不区分大小写的排序规则。 ## 支持的字符集和排序规则 @@ -52,6 +84,22 @@ mysql> show collation; 5 rows in set (0.01 sec) ``` +TiDB支持以下排序规则: + +```sql +mysql> show collation; ++-------------+---------+------+---------+----------+---------+ +| Collation | Charset | Id | Default | Compiled | Sortlen | ++-------------+---------+------+---------+----------+---------+ +| utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 | +| latin1_bin | latin1 | 47 | Yes | Yes | 1 | +| binary | binary | 63 | Yes | Yes | 1 | +| ascii_bin | ascii | 65 | Yes | Yes | 1 | +| utf8_bin | utf8 | 83 | Yes | Yes | 1 | ++-------------+---------+------+---------+----------+---------+ +5 rows in set (0.01 sec) +``` + > **注意:** > > 每个字符集可能对应多个排序规则,但与之对应的**默认排序规则**有且仅有一个。 @@ -74,6 +122,42 @@ SHOW COLLATION WHERE Charset = 'utf8mb4'; 2 rows in set (0.00 sec) ``` +## TiDB中的`utf8`和`ut8mb4` + +MySQL 限制字符集 `utf8` 为最多 3 个字节。这足以在基本多语言平面(BMP)中存储字符,但不足以存储表情符号等字符。因此,建议改用字符集`utf8mb4`。 + +默认情况下,TiDB同样限制字符集 `utf8` 为最多 3 个字节,以确保TiDB中创建的数据可以在 MySQL 中顺利恢复。可以在 TiDB 配置文件中将 `check-mb4-value-in-utf8` 的值更改为 `FALSE` 来禁用此功能。 + +以下示例演示了在表中插入 4 字节的表情符号字符时的默认行为。`utf8` 字符集下`INSERT` 语句不能执行,`ut8mb4` 字符集下可以执行 `INSERT` 语句: + +```sql +mysql> CREATE TABLE utf8_test ( + -> c char(1) NOT NULL + -> ) CHARACTER SET utf8; +Query OK, 0 rows affected (0.09 sec) + +mysql> CREATE TABLE utf8m4_test ( + -> c char(1) NOT NULL + -> ) CHARACTER SET utf8mb4; +Query OK, 0 rows affected (0.09 sec) + +mysql> INSERT INTO utf8_test VALUES ('😉'); +ERROR 1366 (HY000): incorrect utf8 value f09f9889(😉) for column c +mysql> INSERT INTO utf8m4_test VALUES ('😉'); +Query OK, 1 row affected (0.02 sec) + +mysql> SELECT char_length(c), length(c), c FROM utf8_test; +Empty set (0.01 sec) + +mysql> SELECT char_length(c), length(c), c FROM utf8m4_test; ++----------------+-----------+------+ +| char_length(c) | length(c) | c | ++----------------+-----------+------+ +| 1 | 4 | 😉 | ++----------------+-----------+------+ +1 row in set (0.00 sec) +``` + ## 不同范围的字符集和排序规则 字符集和排序规则可以在设置在不同的层次。 From 9bf80661ce5ccad527dd7c447a95a0d10c533107 Mon Sep 17 00:00:00 2001 From: ireneontheway <48651140+ireneontheway@users.noreply.github.com> Date: Thu, 6 Aug 2020 10:01:46 +0800 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Keke Yi <40977455+yikeke@users.noreply.github.com> --- character-set-and-collation.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/character-set-and-collation.md b/character-set-and-collation.md index 358e76a9d1c8..635c78ab8807 100644 --- a/character-set-and-collation.md +++ b/character-set-and-collation.md @@ -9,7 +9,7 @@ aliases: ['/docs-cn/dev/character-set-and-collation/','/docs-cn/dev/reference/sq ## 字符集和排序规则的概念 -字符集 (character set) 是符号与编码的集合。TiDB 中的默认字符集是 utf8mb4,与 MySQL 8.0 及更高版本中的默认字符匹配。 +字符集 (character set) 是符号与编码的集合。TiDB 中的默认字符集是 utf8mb4,与 MySQL 8.0 及更高版本中的默认字符集匹配。 排序规则 (collation) 是在字符集中比较字符以及字符排序顺序的规则。例如,在二进制排序规则中,比较“A”和“a”的结果是不一样的: @@ -43,7 +43,7 @@ mysql> SELECT 'A' = 'a'; 1 row in set (0.00 sec) ``` -TiDB 默认使用二进制排序规则。与 MySQL 不同,MySQL 默认使用不区分大小写的排序规则。 +TiDB 默认使用二进制排序规则。这一点与 MySQL 不同,MySQL 默认使用不区分大小写的排序规则。 ## 支持的字符集和排序规则 @@ -84,7 +84,7 @@ mysql> show collation; 5 rows in set (0.01 sec) ``` -TiDB支持以下排序规则: +TiDB 支持以下排序规则: ```sql mysql> show collation; @@ -122,13 +122,13 @@ SHOW COLLATION WHERE Charset = 'utf8mb4'; 2 rows in set (0.00 sec) ``` -## TiDB中的`utf8`和`ut8mb4` +## TiDB 中的 `utf8` 和 `ut8mb4` -MySQL 限制字符集 `utf8` 为最多 3 个字节。这足以在基本多语言平面(BMP)中存储字符,但不足以存储表情符号等字符。因此,建议改用字符集`utf8mb4`。 +MySQL 限制字符集 `utf8` 为最多 3 个字节。这足以在基本多语言平面 (BMP) 中存储字符,但不足以存储表情符号等字符。因此,建议改用字符集`utf8mb4`。 -默认情况下,TiDB同样限制字符集 `utf8` 为最多 3 个字节,以确保TiDB中创建的数据可以在 MySQL 中顺利恢复。可以在 TiDB 配置文件中将 `check-mb4-value-in-utf8` 的值更改为 `FALSE` 来禁用此功能。 +默认情况下,TiDB 同样限制字符集 `utf8` 为最多 3 个字节,以确保 TiDB 中创建的数据可以在 MySQL 中顺利恢复。你可以禁用此功能,方法是在 TiDB 配置文件中将 `check-mb4-value-in-utf8` 的值更改为 `FALSE`。 -以下示例演示了在表中插入 4 字节的表情符号字符时的默认行为。`utf8` 字符集下`INSERT` 语句不能执行,`ut8mb4` 字符集下可以执行 `INSERT` 语句: +以下示例演示了在表中插入 4 字节的表情符号字符时的默认行为。`utf8` 字符集下 `INSERT` 语句不能执行,`ut8mb4` 字符集下可以执行 `INSERT` 语句: ```sql mysql> CREATE TABLE utf8_test ( From 8c7b635b5c114236dd6cc14e2007a24b603ef26e Mon Sep 17 00:00:00 2001 From: ireneontheway <48651140+ireneontheway@users.noreply.github.com> Date: Mon, 10 Aug 2020 11:18:13 +0800 Subject: [PATCH 3/3] Update character-set-and-collation.md --- character-set-and-collation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/character-set-and-collation.md b/character-set-and-collation.md index 2ac490ba0d64..1448d6ea68d3 100644 --- a/character-set-and-collation.md +++ b/character-set-and-collation.md @@ -124,7 +124,7 @@ SHOW COLLATION WHERE Charset = 'utf8mb4'; ## TiDB 中的 `utf8` 和 `ut8mb4` -MySQL 限制字符集 `utf8` 为最多 3 个字节。这足以在基本多语言平面 (BMP) 中存储字符,但不足以存储表情符号等字符。因此,建议改用字符集`utf8mb4`。 +MySQL 限制字符集 `utf8` 为最多 3 个字节。这足以存储在基本多语言平面 (BMP) 中的字符,但不足以存储表情符号等字符。因此,建议改用字符集`utf8mb4`。 默认情况下,TiDB 同样限制字符集 `utf8` 为最多 3 个字节,以确保 TiDB 中创建的数据可以在 MySQL 中顺利恢复。你可以禁用此功能,方法是在 TiDB 配置文件中将 `check-mb4-value-in-utf8` 的值更改为 `FALSE`。