写sql的是遇到一个奇葩的bug...
测试的时候发现同一个字段,传 1 进去正常,传 0 进去就报错了,提示BadSqlGrammarException
查看日志发现两次执行的sql语句是不一样的:
动态sql语句:
<if test="isPublished!=null and isPublished!=''">is_published=#{isPublished},</if>
值为 0:
UPDATE pms_spu WHERE id=?
值为1:
UPDATE pms_spu SET is_published=? WHERE id=?
显然当isPublished=0的时候,test判定为false,原因只能是 0 != '' 判定为false;
于是我测试了一下:
SELECT 0='';
# 结果 1
SELECT 0='0a';
# 结果 1
SELECT 0='sdfsdf';
# 结果 1
SELECT 0='1fsdf';
# 结果 0
SELECT 0='a1fsdf';
# 结果 1
原因:
当比较数字和varchar类型的值时,mysql会进行类型转换,把varchar类型的转为数字类型来比较,首字符为0或者其他字符的都会被转换成0,使用0=varchar字符只能排除掉首字符为非零数字的字符串