tidb4.0.9与tidb7.5.7区分大小写问题

【TiDB 使用环境】生产环境
【TiDB 版本】v4.0.9 、v7.5.7
【遇到的问题:问题现象及影响】
在进行tidb版本升级时,遇到字段的值区分大小写问题。如何调整可以兼容老集群。v4.0.9集群字段的值区分大小写,而v7.5.7版本集群字段的值不区分大小写。
v4.0.9集群


v7.5.7集群

字段使用 _bin collation

例如:

varchar(50) COLLATE utf8mb4_bin

或者修改表:

ALTER TABLE t
MODIFY name varchar(50)
COLLATE utf8mb4_bin;

这样:

abc ≠ ABC

行为与旧集群一致。


https://docs.pingcap.com/zh/tidb/stable/character-set-and-collation/

TiDB 对大小写的敏感程度,核心由数据库 / 表的 COLLATE(排序规则) 控制,而非单纯的版本特性。图片中表的 COLLATE 为 utf8mb4_unicode_ci_ci 后缀表示 case-insensitive,不区分大小写),但 4.0.9 集群实际表现为区分,大概率是老集群使用了 utf8mb4_bin(二进制比较,区分大小写)或系统参数差异。

嗯,应该用 utf8mb4_bin就区分大小写

比较字符集配置也会影响到大小写

分别查询下两个集群的字符集,然后将高版本的字符集改成和低版本的一致即可

  • v4.0.9 集群:默认(或配置)为区分大小写,通常是因为:
  • lower_case_table_names = 2(TiDB 兼容 MySQL 的配置,表名区分大小写,字段值由 Collation 决定);
  • 字段使用 utf8_bin/ascii_bin二进制排序规则(二进制比较,严格区分大小写)。
  • v7.5.7 集群:默认不区分大小写,通常是因为:
  • lower_case_table_names = 1(表名不区分,字段值默认用 utf8_general_ci/utf8mb4_general_ci 等不区分大小写的 Collation);
  • 升级后未继承老集群的 Collation 配置,导致字段值比较规则变化。

[server]
collation-server = “utf8mb4_bin”
new-collations-enabled = false # 强制用旧框架

– 改表默认 collation
ALTER TABLE 表名 DEFAULT COLLATE utf8mb4_bin;
– 改字段 collation(推荐)
ALTER TABLE 表名 MODIFY 字段名 VARCHAR(255) COLLATE utf8mb4_bin;

如果是元数据,例如表名、view名等,是受lower_case_table_names参数控制的。
如果是表中数据,则与collation有关