TiDB 6.x 新特性解读 | Collation 规则

对数据库而言,合适的字符集和 collation 规则能够大大提升使用者运维和分析的效率。TiDB 从 v4.0 开始支持新 collation 规则,并于 TiDB 6.0 版本进行了更新。本文将深入解读 Collation 规则在 TiDB 6.0 中的变更和应用。

这里的“引”,有两层含义,这第一层是“ 引言”,从  TiDB v6.0 发版说明   中可以了解到,TiDB 6.0 引入了很多新特性,同时也引入了新的  发版模型   ,本文将对 TiDB 6.0 新特性一睹为快。

第二层含义是“抛砖 引玉”,开源社区的力量是无穷尽的,希望有更多人可以参与到开源中来,那么如何参与开源,其实途径远不止提交代码一种,比如,在 AskTUG 社区提问、回答、互动,再如,发现  TiDB 官方文档   有 Bug 或信息不完整,提出 Issue 和解决方案,又如,参与  TiDB 6.0 Book Rush!   活动,做版本评测、案例文章等等。

默认启用新 Collation 规则

1

TiDB 从 v4.0 开始支持新 collation 规则,在大小写不敏感、口音不敏感、padding 规则上与 MySQL 行为保持一致。

TiDB 6.0 默认采用新的 Collation 规则。新 Collation 规则虽已在 TiDB 4.0 引入,但一直都是默认关闭项,只有集群初始化时才能变更。可通过系统表看到该变量值的设定。

1

2

3

4

5

6

7

TiDB [(none)] 18:45:27> select * from mysql.tidb where variable_name = 'new_collation_enabled';

+-----------------------+----------------+----------------------------------------------------+

| VARIABLE_NAME         | VARIABLE_VALUE | COMMENT                                            |

+-----------------------+----------------+----------------------------------------------------+

| new_collation_enabled | True           | If the new collations are enabled. Do not edit it. |

+-----------------------+----------------+----------------------------------------------------+

1 row in set (0.003 sec)

查看  I_S.collations 表,可以知道 TiDB 6.0 已支持 11 种规则,较之前未启用新 collation 框架的版本新增了 5 种规则,分别是  gbk_bin,  gbk_chinese_ci,  utf8_general_ci, utf8_unicode_ci,  utf8mb4_unicode_ci

由于很多旧系统使用的是 GBK 字符集,所以在做系统重构的项目,尤其涉及到数据迁移的情况时,对于 GBK 字符集的支持就显得尤为重要和实用。当然,对于新项目,建议使用 UTF8mb4。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

TiDB [(none)] 18:45:51> select version()\G

*************************** 1. row ***************************

version(): 5.7.25-TiDB-v6.0.0

1 row in set (0.001 sec)

TiDB [(none)] 18:46:00> SELECT * FROM information_schema.collations;

+--------------------+--------------------+------+------------+-------------+---------+

| COLLATION_NAME     | CHARACTER_SET_NAME | ID   | IS_DEFAULT | IS_COMPILED | SORTLEN |

+--------------------+--------------------+------+------------+-------------+---------+

| ascii_bin          | ascii              |   65 | Yes        | Yes         |       1 |

| binary             | binary             |   63 | Yes        | Yes         |       1 |

| gbk_bin            | gbk                |   87 |            | Yes         |       1 | (#28645)

| gbk_chinese_ci     | gbk                |   28 | Yes        | Yes         |       1 | (#28645)

| latin1_bin         | latin1             |   47 | Yes        | Yes         |       1 |

| utf8_bin           | utf8               |   83 | Yes        | Yes         |       1 |

| utf8_general_ci    | utf8               |   33 |            | Yes         |       1 |

| utf8_unicode_ci    | utf8               |  192 |            | Yes         |       1 | (#18678)

| utf8mb4_bin        | utf8mb4            |   46 | Yes        | Yes         |       1 |

| utf8mb4_general_ci | utf8mb4            |   45 |            | Yes         |       1 |

| utf8mb4_unicode_ci | utf8mb4            |  224 |            | Yes         |       1 | (#18678)

+--------------------+--------------------+------+------------+-------------+---------+

11 rows in set (0.001 sec)

TiDB [test] 19:05:14> SHOW CHARACTER SET;

+---------+-------------------------------------+-------------------+--------+

| Charset | Description                         | Default collation | Maxlen |

+---------+-------------------------------------+-------------------+--------+

| ascii   | US ASCII                            | ascii_bin         |      1 |

| binary  | binary                              | binary            |      1 |

| 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 |

+---------+-------------------------------------+-------------------+--------+

6 rows in set (0.001 sec)

而在 TiDB v5.4 未启用新 Collation 的结果为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

TiDB-v5.4 [test] 10:17:22> select version()\G

*************************** 1. row ***************************

version(): 5.7.25-TiDB-v5.4.0

1 row in set (0.001 sec)

TiDB-v5.4 [test] 10:19:39> SELECT * FROM information_schema.collations;

+----------------+--------------------+------+------------+-------------+---------+

| COLLATION_NAME | CHARACTER_SET_NAME | ID   | IS_DEFAULT | IS_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 |

| gbk_bin        | gbk                |   87 | Yes        | Yes         |       1 |

+----------------+--------------------+------+------------+-------------+---------+

6 rows in set (0.001 sec)

新 Collation 注意事项

对于 TiDB 6.0 之前的版本,该配置项的默认值一直为 false ,但可以在集群初始化之前就改变其设定,如此就可以在集群初始化之后使用新的 collation 框架。

1

2

3

service_configs:

  tidb:

    new_collations_enabled_on_first_bootstrap: true

不过,这里要强调注意的是,当 TiDB 集群跨大版本升级时,需要检查配置项。以免出现上下游集群字符校验规则不一致而导致数据不同步或查询结果不一致的情况。另外,当使用 BR 进行数据备份、恢复时,也需要注意 Collation 的设置,保证备份前、恢复后的集群设置相同,防止出现因配置项 new_collations_enabled_on_first_bootstrap  设定不同而报错。

Collation Bug 修复

TiDB 6.0 中修复了2个关于 Collation 的 Bug,分别与比较函数和 JSON 相关,下面举两个小案例对其进行测试。

  1. 修复带有 collation 的 greatest 或 least 函数结果出错的问题 #31789

测试用例:

1

2

3

4

5

6

7

8

9

10

11

DROP TABLE IF EXISTS t1;

CREATE TABLE t1 (

c1 char(20) CHARACTER SET utf8 COLLATE utf8_bin,

c2 char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin);

INSERT INTO t1 VALUES ('UUtJeaV','snRXXCZHBPW');

SET names utf8mb4 collate utf8mb4_bin;

SELECT greatest( c1, c2 ) as expr1 FROM t1;

SELECT least( c1, c2 ) as expr1 FROM t1;

SET names utf8mb4 collate utf8mb4_general_ci;

SELECT greatest( c1, c2 ) as expr1 FROM t1;

SELECT least( c1, c2 ) as expr1 FROM t1;

测试结果:

  • TiDB v5.4.0

1.png

  • TiDB v6.0.0

2.png

        2. 修复了 json 类型在 builtin-func 中推导 collation 错误的问题 #31320

修复这个问题的主要代码如下,期望表现是与 MySQL 一致,在使用 JSON 类型的内部方法时,应当始终使用  utf8mb4_bin 规则。

1

2

3

4

5

// The collation of JSON is always utf8mb4_bin in builtin-func which is same as MySQL

// see details https://github.com/pingcap/tidb/issues/31320#issuecomment-1010599311

if isJSON {

   dstCharset, dstCollation = charset.CharsetUTF8MB4, charset.CollationUTF8MB4

}

测试用例:

1

2

3

4

DROP TABLE IF EXISTS t2;

CREATE TABLE t2 (c1 json);

INSERT INTO t2 VALUES ('{\"测试\": \"你好\"}');

SELECT collation(c1), collation(upper(c1)), collation(elt(1, c1, 0x12)) FROM t2;

测试结果:

3.png

在 TiDB v5.4 中的测试结果为:

4.jpg

新增内置函数  CHARSET()

TiDB 6.0 新增了一个新内置函数,用来判定入参的字符集,这与 Collation 是相关联的,所以一并举例演示。注:从 Issue  #3931   记录来看,这个需求早在 2017 年就提出来了,但是到 6.0 才合并到主干代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

TiDB [test] 23:54:42> select version()\G

*************************** 1. row ***************************

version(): 5.7.25-TiDB-v6.0.0

1 row in set (0.001 sec)

TiDB [test] 00:03:51> set names utf8mb4;

Query OK, 0 rows affected (0.000 sec)

TiDB [test] 00:03:58> select charset(1);

+------------+

| charset(1) |

+------------+

| binary     |

+------------+

1 row in set (0.001 sec)

TiDB [test] 00:04:03> select charset('1');

+--------------+

| charset('1') |

+--------------+

| utf8mb4      |

+--------------+

1 row in set (0.001 sec)

文档拾遗

正如开篇所提到的,参与开源的途径有很多种,我们从开源中收益,自然也要回馈社区。

举一个实际例子,在写本文查阅文档时,就发现了  Collations   这节在 v6.0 (DMR) 版本下的查询结果集与实际不符,于是便进行了反馈。

5.png

在 GitHub 上提交了 Issue,处理速度也很快,第二天就已经完成初步修改,现处 Merge 到 master。

本文对 Collation 特性在 TiDB 6.0 中的变更进行了汇总阐释及举例说明,当前 TiDB 所提供的几种 Collation 已经可以支撑大部分业务场景,和大部分系统迁移需求建议在项目设计之初,就选用普适类型的字符集和规则,毕竟效率是提升生产力的重要因素之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2980495.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【服务器部署篇】Linux下Ansible安装和配置

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是,产…

碳课堂|什么是碳市场?如何进行碳交易?

近年来,随着全球变暖问题日益受到重视,碳达峰、碳中和成为国际社会共识,为更好地减缓和适应气候变化,同时降低碳关税风险,以“二氧化碳的排放权利”为商品的碳交易和碳市场应时而生。 一、什么是碳交易、碳市场 各国…

python爬虫 - 爬取html中的script数据(36kr.com新闻信息)

文章目录 1. 分析页面内容数据格式2. 使用re.findall方法,爬取新闻3. 使用re.search 方法,爬取新闻 1. 分析页面内容数据格式 打开 https://36kr.com/ 按F12(或 在网页上右键 --> 检查(Inspect)) 找…

17.Nacos与Eureka区别

Nacos会将服务的提供者分为临时实例和非临时实例。默认为临时实例。 临时实例跟eureka一样,会向注册中心报告心跳监测自己是否还活着。如果不正常了nacos会剔除临时实例。(捡来的孩子) 非临时实例,nacos会主动询问服务提供者是否…

Unity进阶之ScriptableObject

目录 ScriptableObject 概述ScriptableObject数据文件的创建数据文件的使用非持久数据让其真正意义上的持久ScriptableObject的应用配置数据复用数据数据带来的多态行为单例模式化的获取数据 ScriptableObject 概述 ScriptableObject是什么 ScriptableObject是Unity提供的一个…

ElasticSearch笔记一

随着这个业务的发展,我们的数据量越来越庞大。那么传统的这种mysql的数据库就渐渐的难以满足我们复杂的业务需求了。 所以在微服务架构下一般都会用到一种分布式搜索的技术。那么今天呢我们就会带着大家去学习分布搜索当中最流行的一种ElasticSearch,Ela…

锂电池3.7V-4.2V降3.3V2.8V同步降压WT6015

锂电池3.7V-4.2V降3.3V2.8V同步降压WT6015 WT6015 是一款高效单片同步步降稳压器,采用恒定频率和电流模式架构。该设备提供可调节版本,适应不同的应用需求。在无负载条件下,其电源电流仅为40微安,而在关断状态下,电流…

HTB Runner

Runner User Nmap ──(root㉿kali)-[/home/…/machine/SeasonV/linux/Runner] └─# nmap -A runner.htb -T 4 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-22 23:07 EDT Stats: 0:00:01 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Sca…

【ks爬虫软件】把快手评论API接口封装成GUI采集工具

用Python开发爬虫采集软件,可自动抓取快手评论数据,且包含二级评论。 快手的评论接口URL: # 请求地址 url https://www.kuaishou.com/graphql开发者模式分析过程: 进而封装成GUI界面软件,如下: 软件效…

BI系统在银行有哪些应用场景?为什么说银行BI国产化是必然趋势?

银行业作为我国信息化程度最高的行业之一,最早开始迈出 IT国产化的步伐。然而,由于银行业数据的高度保密性、密集性、敏感性,以及业务的多元且复杂、对国家运行影响程度大,银行 IT国产化道阻且长。银行 IT国产化的核心问题去 IOE&…

【笔试强训】day9

1.添加逗号 思路&#xff1a; 没思路 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> #include<algorithm> using namespace std;int main() {string a;cin >> a;string ans;int p 1;for (int i a.si…

大模型-入门小知识

大模型是什么 大量参数&#xff08;上亿&#xff09;深度学习模型 人工只能包含机器学习&#xff0c;深度学习,深度学习包括大模型 单个神经元的计算模型&#xff1a; 大模型是怎么训练的 之前是算法&#xff08;神经网络&#xff09;----> 训练&#xff08;门槛降低&…

【IR 论文】Google 对通过 prompt LLM 做 Query Expansion 的工作

论文&#xff1a;Query Expansion by Prompting Large Language Models ⭐⭐⭐ Google Research, arxiv:2305.03653 论文速读 之前我在论文笔记 Query2doc 中介绍了信息检索&#xff08;IR&#xff09;以及 Query Expansion 的相关背景知识。 本篇文章是 Google 发表的关于对…

【NUCLEO-G071RB】005——RCC-PLL时钟配置

NUCLEO-G071RB&#xff1a;005——RCC-PLL时钟配置 设计目标芯片配置程序修改仿真测试 设计目标 将HSI通过PLL倍频到64MHz&#xff0c;并作为系统时钟。 芯片配置 切换到Clock Configuration选项卡&#xff0c;以图形化界面配置时钟。System Clock Mux是CPU核心的时钟源选择…

QT初识

通过图形化界面输出helloworld 既然学习了QT&#xff0c;那么自然要做经典的输出helloworld字符串的实验。 QT有两好几种方案输出helloworld&#xff0c;一种是通过图形化界面输出&#xff0c;一种是通过代码实现。 这里先了解图形化界面的方案。 创建项目后&#xff0c;点…

小米一面:说说MVC与设计模式的关系

前言 大家好&#xff0c;我叫阿杆&#xff0c;不叫阿轩。 先来看看面试环节吧。 面试官&#xff1a;请说说MVC模式是基于哪种设计模式的&#xff1f; 求职者&#xff1a;MVC本身不就是一种设计模式吗&#xff1f; 面试官&#xff1a;我的意思是&#xff0c;MVC是基于23中设计…

考研数学|武忠祥强化课VS张宇强化课(全面对比)

在我看来&#xff0c;这两个老师都很好&#xff0c;选者任何一个都不会踩坑&#xff01; 区别就是&#xff0c;这两个老师属于不同的打法&#xff01; 张宇老师属“仙人指路”型&#xff0c;他会在强化课程&#xff0c;把各种类型的习题总结在一起&#xff0c;然后给学生讲清…

docker内实现多机多卡分布式训练

docker内实现多机多卡分布式训练 1. 多台docker宿主机网络配置2. 创建overlay 网络3. 注意 1. 多台docker宿主机网络配置 https://docs.docker.com/network/overlay/ 这里需要创建overlay网络使得多台宿主机的容器可以通过网络连接 初始化swarm集群&#xff0c;并设置主节点&a…

C语言实现扫雷游戏完整实现(上)

文章目录 前言一、新建好头文件和源文件二、实现游戏菜单选择功能三、定义游戏函数四、初始化棋盘五、 打印棋盘函数六、布置雷函数七、玩家排雷菜单八、标记功能的菜单九、标记功能菜单的实现总结 前言 C语言从新建文件到游戏菜单&#xff0c;游戏函数&#xff0c;初始化棋盘…

鸿蒙OpenHarmony【小型系统运行案例】 (基于Hi3516开发板)

运行 启动系统 在完成Hi3516DV300的烧录后&#xff0c;还需要设置BootLoader引导程序&#xff0c;才能运行OpenHarmony系统。 在Hi3516DV300任务中&#xff0c;单击Configure bootloader&#xff08;Boot OS&#xff09;进行配置即可。 说明&#xff1a; DevEco Device Tool…