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

问题描述:

        项目场景有一个表一对多的场景,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');


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容