表结构:
-- 表的ddl
CREATE TABLE `user_desc` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`USER_NAME` varchar(255) DEFAULT NULL COMMENT '用户名',
`AGE` int(5) DEFAULT NULL COMMENT '年龄',
`COUNTRY` varchar(50) DEFAULT NULL COMMENT '国家',
`USER_STATUS` varchar(5) DEFAULT '1' COMMENT '用户状态(0:弃用,1:在线,2:下线)',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
表数据:
ID | USER_NAME | AGE | COUNTRY | USER_STATUS |
---|---|---|---|---|
1 | 周杰伦 | 33 | 中国 | 1 |
2 | 胡歌 | 22 | 中国 | 2 |
3 | 欢欢 | 21 | 美国 | 0 |
查询Sql
-- 查询sql,查询用户状态为在线的, 并拼接一个计划中应查不到数据的参数
SELECT
ID,
USER_NAME,
AGE,
COUNTRY,
USER_STATUS
FROM
user_desc
WHERE
USER_STATUS IN ('1', '')
查询结果:
ID | USER_NAME | AGE | COUNTRY | USER_STATUS |
---|---|---|---|---|
1 | 周杰伦 | 33 | 中国 | 1 |
3 | 欢欢 | 21 | 美国 | 0 |
问题:
把USER_STATUS为0的数据查出来了,而我当时只需要状态为1的数据
后来发现是由于MySql中会将''空字符串当做数值0来处理
而当时这么写是由于业务需求有要求,我们为了开发方便,就在只查单个状态时,想要加上一个查不出其他状态数据的条件,我们的处理方案是
将字段类型改为varchar类型
再使用相同的查询sql后,数据正常显示
虽然最后我们找到了问题所在, 但是这种sql还是感觉不够整洁, 因此我们又在生成sql前进行了数据的处理, 当只需要一种状态时,就只查一种状态的值,在sql不出错的情况下又保证了整洁性, 在此记录下这个踩过的坑。
才疏学浅,如文中有错误,感谢大家指出。