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

news2025/1/11 20:50:27

对数据库而言,合适的字符集和 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.coloradmin.cn/o/1618796.html

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

相关文章

小程序线多点路图绘制

需求 当接口返回一连串地图坐标,需要根据这些坐标串联起来,形成一个线路图(本次使用步行导航线路图)。 思路 首先优先想到使用小程序Map组件的polyline属性去进行展示。但是我们发现直接使用该属性进行坐标绘制画出来的数据都是…

李沐56_门控循环单元——自学笔记

关注每一个序列 1.不是每个观察值都是同等重要 2.想只记住的观察需要:能关注的机制(更新门 update gate)、能遗忘的机制(重置门 reset gate) !pip install --upgrade d2l0.17.5 #d2l需要更新import torch from tor…

10.MMD 室内场景导入背景视频和灯光

导入背景视频 1. 导入人物和场景 场景是Akali’s room,可以在墙壁上添加视频 先添加主场景 2. 修改视频文件格式 在背景里选择导入背景视频文件 需要将mp4视频格式转化为AVI格式 方法一 先将视频导入格式工厂 点击配置 将视频编码改成DivX 再开始处理 …

高效率Python开发工具PyCharm v2024.1——更新AI Assistant功能

JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 立即获取PyCharm v2024.1正式版(Q技术交流:909157416&…

利用Spring中的SchedulingConfigurer实现数据库配置化定时任务

目录 1.利用Scheduled来实现传统的定时任务 2.两者的区别 3.Spring中的SchedulingConfigurer来拓展定时任务的灵活性 1)UrTaskConfig 2)TaskMain 3)BaseTask 4)效果 (1)插入配置定时任务的sql语句 …

参数传递 的案例

文章目录 12 1 输出一个int类型的数组,要求为: [11,22,33,44,55] package com.zhang.parameter; //有关方法的案例 public class MethodTest3 {public static void main(String[] args) {//输出一个int类型的数组,要求为: [11,…

UE4网络图片加载库(带内存缓存和磁盘缓存)

UE4网络图片加载库,带内存缓存和磁盘缓存,支持自定义缓存大小,支持蓝图和C++代码调用 1、调用示例 2、对外暴露函数 3、源代码-网络模块 KeImageNet.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreM…

在控制台实现贪吃蛇

在控制台实现贪吃蛇 前备知识Win32APICOORD这个结构体的声明如下:GetStdHandle 函数GetConsoleCursorInfo 函数SetConsoleCursorInfo 函数 SetConsoleCursorPosition 函数getAsyncKeyState 函数 控制台窗口的大小以及字符打印介绍控制台中的坐标宽字符及本地化介绍s…

的记忆:pandas(实在会忘记,就看作是一个 Excel 表格,或者是 SQL 表,或者是字典的字典。)

pandas 是一个开源的 Python 数据分析库,它提供了快速、灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的“快速分析、清洗和转换”变得既简单又直观。pandas 非常适合于数据清洗和转换、数据分析和建模等任务。以下是 pandas 的基本概念和主…

使用 Flutter 打造引人入胜的休闲游戏体验

作者 / Zoey Fan 去年,Flutter 休闲游戏工具包进行了一次重大更新。近期在旧金山举办的游戏开发者大会 (GDC) 上,Flutter 首次亮相。GDC 是游戏行业的顶级专业盛会,致力于帮助游戏开发者不断提升开发技能。欢迎您继续阅读,了解开发…

Redis(四) 主从、哨兵、集群环境搭建

结合前三期 Redis(一) Redis简介(Redis(一) Redis简介-CSDN博客) Redis(二) 可编程性(Redis(二) 可编程性-CSDN博客) Redis(三) 事务与发布订阅(Redis(三) 事务与发布订阅-CSDN博客) 目录 1.0 Redis主从 1.1 Redis 主从结构的基本原理和工作方式 1.2 Redis 主从结构的好处 …

经典案例|使用Supabase解决可视化大屏项目的常见问题

敏博科技专业致力于应急管理行业,提供以物联网技术和感知预警算法模型为核心的先进产品和解决方案。应急管理行业的业务非常繁多和复杂,很多时候都需要在短时间内交付出稳定高效的业务系统。如下两张图某市的安全生产监测预警系统 MemFire Cloud应用开…

图像处理之模板匹配(C++)

图像处理之模板匹配(C) 文章目录 图像处理之模板匹配(C)前言一、基于灰度的模板匹配1.原理2.代码实现3.结果展示 总结 前言 模板匹配的算法包括基于灰度的匹配、基于特征的匹配、基于组件的匹配、基于相关性的匹配以及局部变形匹…

Maven的下载和环境变量的配置

1下载 maven官网https://maven.apache.org/index.html点击Download 这个是Windows的下载版本,一般是最新的版本, 老的版本下载 以下是对应的老版本下载链接 下载好后是一个压缩包的形式 点击他进行解压到想放的文件夹中,(一般不…

设计模式-00 设计模式简介之几大原则

设计模式-00 设计模式简介之几大原则 本专栏主要分析自己学习设计模式相关的浅解,并运用modern cpp 来是实现,描述相关设计模式。 通过编写代码,深入理解设计模式精髓,并且很好的帮助自己掌握设计模式,顺便巩固自己的c…

【神经网络基础辨析】什么是神经网络的主干(backbone)、颈部(neck)和头部(head)网络

在神经网络中,通常将网络分为三个部分:骨干网络(Backbone)、颈部网络(Neck)、和头部网络(Head)。 骨干网络(Backbone) 骨干网络通常是神经网络的主要部分&a…

探索设计模式的魅力:主从模式与AI大模型的结合-开启机器学习新纪元

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索主从模式与AI大模型之旅✨ 🌟Hey, tech enthusiasts! 你是否还在追…

【嵌入式AI部署神经网络】STM32CubeIDE上部署神经网络之指纹识别(Pytorch)——篇一|环境搭建与模型初步部署篇

前言:本篇主要讲解搭建所需环境,以及基于pytorch框架在stm32cubeide上部署神经网络,部署神经网络到STM32单片机,本篇实现初步部署模型,没有加入训练集与验证集,将在第二篇加入。篇二详细讲解STM32CubeIDE上…

PHP之内置web服务器

1. 前言 PHP从5.4开始,就提供了一个内置的web服务器。 这个主要是用来做本地的开发测试用的,不能用于线上环境。 将PHP的安装路径配置到电脑的系统环境变量Path中,下图是win7,win10中会看的更清楚 2. 进入项目目录,执…

OpenHarmony南向开发案例:【 智能家居中控】

应用场景简介 智能家居。 今天打造的这一款全新智能家庭控制系统,凸显应用在智能控制和用户体验的特点,开创国内智能家居系统体验新局面。新的系统主要应用在鸿蒙生态。 工程版本 系统版本/API版本:OpenHarmony SDK API 8IDE版本&#xf…