对数据库而言,合适的字符集和 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 6.0 默认采用新的 Collation 规则。新 Collation 规则虽已在 TiDB 4.0 引入,但一直都是默认关闭项,只有集群初始化时才能变更。可通过系统表看到该变量值的设定。
1 2 3 4 5 6 7 |
|
查看 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 v5.4 未启用新 Collation 的结果为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
新 Collation 注意事项
对于 TiDB 6.0 之前的版本,该配置项的默认值一直为 false ,但可以在集群初始化之前就改变其设定,如此就可以在集群初始化之后使用新的 collation 框架。
1 2 3 |
|
不过,这里要强调注意的是,当 TiDB 集群跨大版本升级时,需要检查配置项。以免出现上下游集群字符校验规则不一致而导致数据不同步或查询结果不一致的情况。另外,当使用 BR 进行数据备份、恢复时,也需要注意 Collation 的设置,保证备份前、恢复后的集群设置相同,防止出现因配置项 new_collations_enabled_on_first_bootstrap
设定不同而报错。
Collation Bug 修复
TiDB 6.0 中修复了2个关于 Collation 的 Bug,分别与比较函数和 JSON 相关,下面举两个小案例对其进行测试。
- 修复带有 collation 的 greatest 或 least 函数结果出错的问题 #31789
测试用例:
1 2 3 4 5 6 7 8 9 10 11 |
|
测试结果:
- TiDB v5.4.0
- TiDB v6.0.0
2. 修复了 json 类型在 builtin-func 中推导 collation 错误的问题 #31320
修复这个问题的主要代码如下,期望表现是与 MySQL 一致,在使用 JSON 类型的内部方法时,应当始终使用 utf8mb4_bin
规则。
1 2 3 4 5 |
|
测试用例:
1 2 3 4 |
|
测试结果:
在 TiDB v5.4 中的测试结果为:
新增内置函数 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 |
|
文档拾遗
正如开篇所提到的,参与开源的途径有很多种,我们从开源中收益,自然也要回馈社区。
举一个实际例子,在写本文查阅文档时,就发现了 Collations 这节在 v6.0 (DMR) 版本下的查询结果集与实际不符,于是便进行了反馈。
在 GitHub 上提交了 Issue,处理速度也很快,第二天就已经完成初步修改,现处 Merge 到 master。
末
本文对 Collation 特性在 TiDB 6.0 中的变更进行了汇总阐释及举例说明,当前 TiDB 所提供的几种 Collation 已经可以支撑大部分业务场景,和大部分系统迁移需求建议在项目设计之初,就选用普适类型的字符集和规则,毕竟效率是提升生产力的重要因素之一。