if null() 结合 like得出结果不对

Bug 反馈
清晰准确地描述您发现的问题,提供任何可能复现问题的步骤有助于研发同学及时处理问题
【 Bug 的影响】
查询结果不对
【可能的问题复现步骤】
建表:
CREATE TABLE d (
id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘PK’,
d_name varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB

插入几十万条数据
做类似如下两条查询
select count(1) from d where ifnull(d_name,‘auto’) like ‘%auto%’;
select count(1) from d where d_name like ‘%auto%’ or d_name is null;
【看到的非预期行为】
二者得到结果不一致
【期望看到的行为】
二者得到结果一致
【相关组件及具体版本】
v4.0.0
【其他背景信息或者截图】
如集群拓扑,系统和内核版本,应用 app 信息等;如果问题跟 SQL 有关,请提供 SQL 语句和相关表的 Schema 信息;如果节点日志存在关键报错,请提供相关节点的日志内容或文件;如果一些业务敏感信息不便提供,请留下联系方式,我们与您私下沟通。

image
在mysql中效果是相同的,在tidb中不同,上图是tidb查询的结果,感觉是把与,或逻辑弄反了

分享遇到过一次类似的,也是查询结果明显错误。我描述一下我的操作:
1、执行explain,查询用到的索引
2、删除查询到的索引,新增查询到的索引。不记得有没有做analyze
3、查询结果正常

可以看下执行计划是不是相同,我这里用 4.0.0 测试是符合预期的


您这插入的数据量不够多吧,我上面的场景是插入了几十万条的数据

还有d_name字段都不为空,然后满足 d_name like '%auto%'有85万条,其余的有10万条

d_name字段都不为空,然后满足 d_name like '%auto%'有85万条,其余的有10万条

按照上面这个条件去测试,也没有复现;可以发一下表结构并导出几条 sample 数据出来么,比如查一下 d_name 都有哪些值然后导出
select d_name, count(*) from d group by d_name;
select * from d where d_name in (‘’,‘’,…) limit 100 into outfile ‘/tmp/sample.txt’;

表结构就是我上面发的,数据没有办法导出,公司的数据

找到原因了,数据这样写
| 1 | abc |
| 2 | def |
| 3 | hij |
| 4 | auto |
| 5 | Auto-Plural |
image
我想是排序规则处理的问题utf8mb4_general_ci

_bin的排序规则我也试过,也不一样,您可以按照我的数据测试下

Bug Report

Please answer these questions before submitting your issue. Thanks!

1. Minimal reproduce step (Required)

mysql> select variable_value from mysql.tidb where variable_name=‘new_collation_enabled’;
±---------------+
| VARIABLE_VALUE |
±---------------+
| True |
±---------------+
1 row in set (0.01 sec)

mysql> create table t(name varchar(10) collate utf8mb4_general_ci default null);
Query OK, 0 rows affected (0.13 sec)

mysql> insert into t values(‘a’),(‘A’);
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0

2. What did you expect to see? (Required)

mysql> select count(1) from t where ifnull(name,‘a’) like ‘%a%’;
±---------+
| count(1) |
±---------+
| 2 |
±---------+
1 row in set (0.01 sec)

3. What did you see instead (Required)

mysql> select count(1) from t where ifnull(name,‘a’) like ‘%a%’;
±---------+
| count(1) |
±---------+
| 1 |
±---------+
1 row in set (0.01 sec)

4. What is your TiDB version? (Required)

TiDB 4.0.0

你好,这个问题在 4.0.x 版本中确实存在,目前 5.0.x 版本已经修复,可以考虑先做下版本升级。

我原来是5.0.1版本,但是group by相关的东西多了好多新bug,原来4.x版本没有的bug,后来为了数据和业务安全,我又降回4.0.0版本了

可以关注 5.0.2 版本,计划6月上旬发布,会修复相关 bug。

好的,感谢

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