踩坑系列——mysql数据库字段类型为tinyint输入字符串条件查询无效

背景

排查问题发现有个查询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会尝试将这个字符串转换为整数来进行比较,结果可能非预期,所以在设置查询条件例如使用枚举值设置条件值的时候要注意不要勿写成了枚举而非值。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值