【TiDB 使用环境】生产环境
【TiDB 版本】v4.0.9 、v7.5.7
【遇到的问题:问题现象及影响】
在进行tidb版本升级时,遇到字段的值区分大小写问题。如何调整可以兼容老集群。v4.0.9集群字段的值区分大小写,而v7.5.7版本集群字段的值不区分大小写。
v4.0.9集群
v7.5.7集群
【TiDB 使用环境】生产环境
【TiDB 版本】v4.0.9 、v7.5.7
【遇到的问题:问题现象及影响】
在进行tidb版本升级时,遇到字段的值区分大小写问题。如何调整可以兼容老集群。v4.0.9集群字段的值区分大小写,而v7.5.7版本集群字段的值不区分大小写。
v4.0.9集群
字段使用 _bin collation
例如:
varchar(50) COLLATE utf8mb4_bin
或者修改表:
ALTER TABLE t
MODIFY name varchar(50)
COLLATE utf8mb4_bin;
这样:
abc ≠ ABC
行为与旧集群一致。
TiDB 对大小写的敏感程度,核心由数据库 / 表的 COLLATE(排序规则) 控制,而非单纯的版本特性。图片中表的 COLLATE 为 utf8mb4_unicode_ci(_ci 后缀表示 case-insensitive,不区分大小写),但 4.0.9 集群实际表现为区分,大概率是老集群使用了 utf8mb4_bin(二进制比较,区分大小写)或系统参数差异。
嗯,应该用 utf8mb4_bin就区分大小写
比较字符集配置也会影响到大小写
分别查询下两个集群的字符集,然后将高版本的字符集改成和低版本的一致即可
lower_case_table_names = 2(TiDB 兼容 MySQL 的配置,表名区分大小写,字段值由 Collation 决定);utf8_bin/ascii_bin 等二进制排序规则(二进制比较,严格区分大小写)。lower_case_table_names = 1(表名不区分,字段值默认用 utf8_general_ci/utf8mb4_general_ci 等不区分大小写的 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有关