电话
400 9058 355
IS NULL 是唯一安全的空值判断方式,因 NULL 是缺失标记而非值,= NULL 永返 NULL;需区分 NULL、空字符串、零值及空格;WHERE 中高效,JOIN 和复合索引中需谨慎;COALESCE 等函数可归一化但可能失效索引。
IS NULL 是唯一安全的空值判断方式MySQL 的 NULL 不是值,而是“缺失值”的标记,所以不能用 = NULL 或 != NULL 判断——这些表达式永远返回 NULL(即逻辑假),导致查询结果为空或不符合预期。必须用 IS NULL 和 IS NOT NULL。
SELECT * FROM users WHERE name = NULL; → 查不到任何记录,哪怕 name 真的是 NULLSELECT * FROM users WHERE name IS NULL; → 正确写法,能命中所有 name 为 NULL 的行''(空字符串)和 NULL 完全不同,IS NULL 对空字符串无效NULL、空字符串和零值的常见陷阱尤其在用户输入字段(如 phone、address)中,可能混入 NULL、''、' '(带空格)、甚至数字 0。仅靠 IS NULL 无法覆盖全部“空”语义。
column IS NULL
TRIM(column) = ''(注意 TRIM 会把 NULL 转成 NULL,所以需配合 OR column IS NULL)num_col IS NULL 
OR num_col = 0,不能写成 COALESCE(num_col, 0) = 0(会误判原本就是 0 的有效数据)WHERE、JOIN 和索引中的行为差异IS NULL 在不同上下文表现不一致,容易引发性能或逻辑问题。
WHERE 中可用且高效:如果字段有索引,IS NULL 可走索引(前提是该索引允许 NULL,比如非唯一索引或明确声明 ALLOW NULL)JOIN 条件中慎用:ON a.id = b.user_id OR b.user_id IS NULL 这类写法会导致笛卡尔积倾向,应优先重构为 LEFT JOIN + 后置过滤(status, created_at),WHERE status IS NULL 可用索引,但 WHERE created_at IS NULL 通常不可用(因前导列 status 未指定确定值)COALESCE 或 IFNULL 统一空值语义当业务上把 NULL、空字符串都视作“空”,又不想写冗长的 OR 条件时,可借助函数归一化,但要注意副作用。
WHERE COALESCE(phone, '') = '' → 把 NULL 转成 '' 再比,覆盖两种情况WHERE IFNULL(email, 'missing') = 'missing' → 更明确地设默认值CREATE INDEX idx ON t ((COALESCE(col, ''))))实际写查询时,先想清楚你要的“空”到底指什么:数据库层面的缺失(IS NULL),还是业务层面的无效(需结合 TRIM、= ''、LENGTH = 0 等)。一个 IS NULL 解决不了所有“空”。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...