由于工作的疏忽,导致了一个问题,问题具体不太好描述,语言表达能力有待提高鸭。。。
话不多说,直接上图
表里的数据是这样的:
表结构是这个鬼样子的:
当我写了一条这样的sql(其实是因为我代码写错导致的5555):
select *from `table` where id in ('[1','2','3]')
一般来讲,下意识会认为1和3都已经跪了,只能查出2来,对吧。因为,in 相当于是多次 = 嘛。
但是这个结果确实这样的:
你会发现只有1不见了,3并没有受到影响。
寻找真谛
那如果这个sql是这样:
select *from `table` where id = '3feso[2'
如此诡异的一句sql,居然还是查出3来了。
很纳闷啊,=不是精确匹配么,为啥后面有那么多诡异的字符还能查出来?
如果换成 varchar类型的呢,再试试:
好像这次看起来才没问题。
总结
当字段类型属于字符串类型时,where条件=才是精确匹配,当多出任意字符(空格除外)时,就会匹配不到。
当字段类型属于数字类型(例如:int,bigint,double…)时,where条件= 这个地方写数字类型那么就是精确匹配,如果是使用字符串类型 ‘1’ 去匹配时,那么会从非数字字符开始往后全部忽略,如:‘1[1’,这时查出来的就是id为1的记录,后面的 [1 就会被忽略掉。
注: 当有这种情况时,应该在进入sql之前,在mapper的参数列表中就强制使用对应的数字类型,避免使用string类型,这样就能避免传入字符串导致查不到的问题了(如果凑巧取到没暴露出来还行,此处属于隐性bug)。