美文网首页sql
记mysql in条件中参数是带引号的字符串查询失效

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

作者: T_wk | 来源:发表于2019-12-17 20:13 被阅读0次

    问题描述:

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ycdenctx.html