记Mysql的int字段用String查询

1,629 阅读1分钟
最近接手一个项目,在代码中发现之前的伙计,在使用枚举时作为sql条件时写得有问题。神奇的是数据的那个int字段的值全部为0。导致这个问题测试没有测出来(此处我认为测试人员也犯了小错误)。枚举类代码大致如下:
public enum DelUtil {
    NO_DEL("未删除", 0), DELETED("已删除", 1);
    private String desc;
    private int val;
    
    private DelUtil( String desc, int val){
        this.desc = desc;
        this.val = val;
    }
     
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public int getVal() {
        return val;
    }
    public void setVal(int val) {
        this.val = val;
    }
}
在查询为删除的数据时,他把参数写成DelUtil.NO_DEL,导致mybatis最后出来的sql条件是 is_del='NO_DEL',最后也把未删除状态的数据查询出来了。按理说正确的写法应该是DelUtil.NO_DEL.getVal()。

不由得对这里的有点好奇,为啥is_del='NO_DEL'能查询出is_del=0的数据。于是做了以下尝试:
创建一个表如下(score字段int类型)

可以看到查出了score=0的所有数据。继续尝试:

由此可以得出结论:mysql当使用String去查询int类型时,会从左到右截取数字部分,如果字符串左端没有数字则为0.