MySQL列值中NULL与空值的差异及查询异常问题咨询
为什么NULL值没有被你的MySQL查询返回?
这个问题其实是SQL里关于NULL值比较的经典坑,很多开发者都会踩中,我来给你拆解清楚:
1. SQL中NULL的核心特性:代表「未知值」
SQL里的NULL和你理解的空字符串''完全不是一回事——它表示的是一个未知的、未定义的值。正因为它是“未知”,所以任何和NULL进行的普通比较(比如=、!=、>、<),结果既不是TRUE也不是FALSE,而是第三种状态:UNKNOWN。
而MySQL的WHERE子句只会保留那些条件判断结果为TRUE的行,UNKNOWN和FALSE都会被过滤掉,这就是你的NULL行没被返回的根本原因。
2. 你的查询具体哪里出了问题?
看你的查询条件:tips_type != 'Collection'
- 当
tips_type是空字符串''时,'' != 'Collection'的结果是TRUE,所以这行会被保留; - 当
tips_type是NULL时,NULL != 'Collection'的结果是UNKNOWN,不符合WHERE子句的筛选要求,所以被过滤; - 同理,如果有
tips_type是Payable的行,这个条件也会返回TRUE,应该会被返回(可能你的数据里刚好没有这类行,所以只看到了空字符串的结果)。
3. 如何修改查询以包含NULL行?
有两种常用的解决方法,你可以根据习惯选择:
方法一:显式检查NULL值
在条件里加上OR tips_type IS NULL,把NULL的情况单独列出来:
SELECT * FROM `tc_wallet` WHERE login_id = 'gaurav.wakharkar' AND `delete_flag` = 'F' AND (`tips_type` != 'Collection' OR `tips_type` IS NULL);
这里一定要注意加括号,保证逻辑优先级正确。
方法二:使用NULL安全的比较操作符
MySQL提供了<=>操作符(也叫NULL安全等于),它会把NULL当作普通值处理:
a <=> b当a和b都是NULL时返回TRUE;- 当其中一个是NULL、另一个不是时返回
FALSE; - 其他情况和普通的
=逻辑一致。
所以我们可以用NOT来取反,实现“不等于'Collection'且包含NULL”的效果:
SELECT * FROM `tc_wallet` WHERE login_id = 'gaurav.wakharkar' AND `delete_flag` = 'F' AND NOT (`tips_type` <=> 'Collection');
最后再区分一下空字符串和NULL
别把''和NULL搞混:
''是一个确定的空值,它和任何非空字符串的比较都会得到明确的TRUE或FALSE;NULL是未知,任何普通比较都无法得到明确结果,必须用IS NULL或IS NOT NULL,或者<=>来处理。
内容的提问来源于stack exchange,提问作者Ajinkya Karode
相关产品推荐
相关产品推荐

