6.1.7版本唯一键与预期不符问题

Bug 反馈
清晰准确地描述您发现的问题,提供任何可能复现问题的步骤有助于研发同学及时处理问题
【 TiDB 版本】 6.1.7
【 Bug 的影响】
唯一键报重复值问题,导致数据写入失败

【可能的问题复现步骤】
1、6.1.7版本新集群初始化的时候指定了【new_collations_enabled_on_first_bootstrap: true】

2、创建测试表指定【COLLATE=utf8mb4_general_ci】

mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `name` char(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
  UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)

3、写入测试数据报唯一键冲突,但是实际上两个值是非冲突数据

mysql> insert into t1 values(1,'a'),(2,'a ');
ERROR 1062 (23000): Duplicate entry 'a' for key 'uk_name'
mysql>

【看到的非预期行为】
看现象是字符串末尾的单个或多个空格会被删除,'a ‘最终写进去都是’a’

【期望看到的行为】
对于唯一索引约束的字段,‘a’ 'a '两个值能正常写入

【相关组件及具体版本】

【其他背景信息或者截图】
如集群拓扑,系统和内核版本,应用 app 信息等;如果问题跟 SQL 有关,请提供 SQL 语句和相关表的 Schema 信息;如果节点日志存在关键报错,请提供相关节点的日志内容或文件;如果一些业务敏感信息不便提供,请留下联系方式,我们与您私下沟通。

这个是正常行为,非 bug ,参考:
https://dev.mysql.com/doc/refman/8.4/en/charset-binary-collations.html#charset-binary-collations-trailing-space-comparisons
https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-sets.html#charset-unicode-sets-pad-attributes

官方文档显示

:thinking:还真是,官方文档有写。感觉这个处理还挺友好的,之前在sqlserver的时候,不处理末尾空格,被这种情况坑过~
https://docs.pingcap.com/zh/tidb/stable/data-type-string#char-类型

mark一下~

从来没注意过这个,学习了🐂

mark 记录下这个, 还真没注意过

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。