背景
排查问题发现有个查询sql的条件传的字符串‘ENABLE’,而数据库这个字段类型是tinyint,值只有0和1,看查询结果过滤出的都是值为0的数据。按自己理解这个语句应该查不出数据,但是结果非预期
排查
问了下ChatGpt给的回答是这样的:
验证
在在线sql数据库上验证,创建表及查询如下:
-- 创建表
CREATE TABLE Product (ID INT AUTO_INCREMENT KEY,Name VARCHAR(100),STATUS TINYINT(1)
);-- 新增数据
INSERT INTO Product(Name, STATUS) VALUES ('aaa', 1);
INSERT INTO Product(Name, STATUS) VALUES ('bbb', 1);
INSERT INTO Product(Name, STATUS) VALUES ('ccc', 0);-- 查询数据
SELECT * FROM Product;
SELECT * FROM Product WHERE STATUS = 1;
SELECT * FROM Product WHERE STATUS = 0;
SELECT * FROM Product WHERE STATUS = 'aaa1';
SELECT * FROM Product WHERE STATUS = '1aaa';
这4个查询的结果如下:
根据以上验证可以看到,排查问题发现的sql传的字符串‘ENABLE’,其实被转成了数字0,所以查询结果过滤出的都是值为0的数据。
总结
在查询中使用了字符串作为TINYINT
类型字段的条件,MySQL会尝试将这个字符串转换为整数来进行比较,结果可能非预期,所以在设置查询条件例如使用枚举值设置条件值的时候要注意不要勿写成了枚举而非值。