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://www.mzph.cn/web/2494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Docker 和 DigitalOcean Kubernetes 上部署 Kafka

Apache Kafka 是一个开源的分布式事件和流处理平台,使用 Java 编写,旨在处理要求严苛的实时数据流。它被设计为具有容错能力,并支持每个集群拥有数百个节点。高效运行更多数量的节点需要容器化和编排流程以实现最优资源使用,例如使…

Modbus转Profinet网关接称重设备与工控机通讯

Modbus转Profinet网关(XD-MDPN100)是一种能够实现Modbus协议和Profinet协议之间转换的设备。Modbus转Profinet网关可提供单个或多个RS485接口,使得不同设备之间可以顺利进行通信,进一步提升了工业自动化程度。 通过使用Modbus转Pr…

相亲平台app小程序

相亲平台app小程序是一种基于手机应用的微型程序,专为在线相亲交友活动设计。它提供了一系列的功能,旨在帮助用户更方便、更高效地找到心仪的伴侣。 首先,用户可以在个人资料部分上传照片、填写个人资料、设置兴趣爱好等信息,以便…

Scala Extention

正则 import scala.util.matching.Regex import scala.util.matching.Regex.Match/*----------------------------------------------------------匹配 */ val rtr "^(\\w)([a-z0-9]{2,})\\.(com|cn|edu|org)$"; val regex:Regex rtr.r // 同 Java 的简单匹配 val…

Electron+Vue3+ElectronForge整合 - 打包时整合 -分步打包

说明 本文介绍一下 Electron Vue3 的打包整合的基本操作。实现的效果是 : 1、一个正常的Vue3项目; 2、整合加入 Electron 框架 :开发时 Electron 加载的是开发的vue项目; 3、完成打包时整合:3.1 先完成vue3项目的正常…

Laravel 6 - 第十一章 中间件

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

Docker搭建NetBox

NetBox 是一个开源的数据中心基础设施管理(DCIM)和IP地址管理(IPAM)平台,用于管理网络设备、服务器、机架、端口、IP 地址和子网。它提供了一个直观的Web界面,允许用户跟踪资产、分配IP地址、规划网络架构以及生成报告。 实际应用场景 网络管理&#x…

http实现反向代理

http实现反向代理 需要安装http-proxy-middleware插件 npm i http-proxy-middleware准备proxy.html, 等会加载proxy.html可直接发起fetch请求 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equ…

深度解析:云计算的三宝——IaaS、PaaS和SaaS

4月22日&#xff0c;腾讯宣布旗下协作SaaS产品全面接入腾讯混元大模型&#xff0c;除去企业微信、腾讯会议、腾讯文档等“一门三杰”产品&#xff0c;腾讯乐享、腾讯电子签、腾讯问卷、腾讯云AI代码助手等协作SaaS产品也都已实现智能化升级。大模型应用落地再加速。 那么什么是…

Java基础入门day37

day37 js小案例 全选&#xff0c;全不选和反选 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Doc…

2024年深圳杯东三省数学建模联赛A题论文首发第二种思路

深圳杯A题论文代码分享资料链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1L2NVgoefSW-yuqZjEB3wcw 提取码&#xff1a;sxjm 问题一 数据转换&#xff1a; 首先&#xff0c;我们将监测站的经纬度坐标转换为基于米的笛卡尔坐标系。这是因为在地面上的大尺度距离…

HarmonyOS开发案例:【音乐播放器】

介绍 使用ArkTS语言实现了一个简易的音乐播放器应用&#xff0c;主要包含以下功能&#xff1a; 播放应用中的音频资源文件&#xff0c;并可进行上一曲、下一曲、播放、暂停、切换播放模式&#xff08;顺序播放、单曲循环、随机播放&#xff09;等操作。结合后台任务管理模块&…

使用python批量采集国家法律法规数据库——科学学习使用!遵守法律!绿色合规!

模块使用: 使用Python的requests模块进行网络请求操作。 目标网址: 国家法律法规数据库网址 实现步骤: 模拟浏览器请求: 设置请求头信息模拟浏览器行为。 请求网址并循环获取数据: 循环页面以获取数据&#xff0c;设置查询参数并使用requests.get()请求数据。 提取数据并保存文…

安全小课堂丨什么是暴力破解?如何防止暴力破解

什么是暴力破解&#xff1f; 暴力破解也可称为穷举法、枚举法&#xff0c;是一种比较流行的密码破译方法&#xff0c;也就是将密码进行一一推算直到找出正确的密码为止。比如一个6位并且全部由数字组成的密码&#xff0c;可能有100万种组合&#xff0c;也就是说最多需要尝试10…

JWT原理解析

一、概述 虽然现在很多的开发框架会支持JWT的使用&#xff0c;但是对JWT还是没有一个详细的了解&#xff0c;有很多疑惑&#xff1a; JWT比之前的session或者token有什么好处&#xff1f;JWT的构成元素是什么&#xff1f;JWT从生成到使用的详细流程&#xff1f; 二、 JWT 2…

SPI Flash and External SPI RAM(基于ESP32)

主要参考资料&#xff1a; 乐鑫ESP-IDF资料SPI Flash API: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-reference/peripherals/spi_flash/index.html 乐鑫ESP-IDF资料SPI Flash and External SPI RAM Configuration: https://docs.espressif.com/pro…

场景 - 分库分表

分什么 数据量大分表&#xff0c;并发大分库 分表字段如何选择 如果对交易订单进行分表&#xff0c;可以选择的东西很多&#xff0c;比如说商户id&#xff0c;用户id&#xff0c;地区等等 分表的时候要考虑到数据倾斜问题 数据倾斜 比如说按商户号进行分表&#xff0c;一共…

pnpm 安装后 node_modules 是什么结构?为什么 webpack 不识别 pnpm 安装的包?

本篇研究&#xff1a;使用 pnpm 安装依赖时&#xff0c;node_modules 下是什么结构 回顾 npm3 之前&#xff1a;依赖树 缺点&#xff1a; frequently packages were creating too deep dependency trees, which caused long directory paths issue on Windowspackages were c…

2024年 Flutter 面试题大全(持续更新中)

提示&#xff1a;页面中按 Ctrl F 查找关键字&#xff0c;点击链接跳转到详情 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&#xff0c;51CTO专家博主。2023博客之星TOP153。 &#x1f…

Php 通过 FFmpeg 获取远程视频的时长和截图

突然发现 FFmpeg 这个软件还可以直接拉取远程视频的相关信息&#xff0c;也就是可以不通过下载视频到本地的方式&#xff0c;直接远程去获取视频时长和截图。 假设我们的视频url是&#xff1a;http://my.com/a.mp4 第一步&#xff0c;Linux 安装 FFmpeg 软件 第二步&#xf…