sql

记mysql in条件中参数是带引号的字符串查询失效

2019-12-17  本文已影响0人  T_wk

问题描述:

        项目场景有一个表一对多的场景,A表一个字段(varchar类型)记录着B表多条记录的主键(bigint类型),中间用逗号隔开,把A表的字符串转换成list放到B语句查询,使用in条件。结果每次查询出来的记录都是字符串的第一个ID对应的记录。

        例如:select * from t_test where id in('1,2');

        表记录:

    执行SQL结果:

排查描述:

1、通过java代码日志打印出来的sql,复制到Navicat中执行,发现查询出来的记录确实一条;

2、怀疑是Navicat查询器的问题,把SQL复制到MySql服务器上执行,发现结果还是一样;

3、发现in条件中的单引号里面包括的是一个逗号隔开的字符串,而不是单个,写了几个列子,执行结果如下所示:

    

4、怀疑是字符串的问题导致记录数,为了再次验证MySql in条件查询时候会把字符串强转成int类型,示例如下所示:

5、从上面的示例得出的结果,在MySql中,如果一个int 类型 + 上一个数,MySql会进行类型转换;

6、对于in条件查询的时候,MySql因为直接传入一个字符串进去,不做任何处理的话,是会被当成一个值,而不是按照‘,’分割。MySql在执行时候,会把参数第一个数进行转换,如果是第一位是数字则会把当前的数字当成查询的条件,如果是一个字母,会被强转当成零进行处理。

解决方法:

1、使用 FIND_IN_SET函数,

2、在代码层进行Arrays.asList进行转换。

对于索引问题:

explain select * from t_test where id in('1,2');    

explain select * from t_test where FIND_IN_SET(id,'1,2');

explain select * from t_test where id in('1','2');

上一篇下一篇

猜你喜欢

热点阅读