从 MySQL 5.x 迁移到 MySQL 8.0 后,部分原本正常的 SQL 查询可能返回空结果。根本原因是 MySQL 8.0 对 SQL 标准的遵循更加严格:NULL 代表“未知值”,任何与 NULL 的比较(包括 =、!=、<>)结果都是 NULL(假),而非 TRUE。因此 WHERE status != 'complate' 无法筛选出 status IS NULL 的数据行。本文通过示例表格对比六种查询条件对 NULL 值的处理结果,并给出两种解决方案:使用 IS NOT NULL 显式判断(WHERE status IS NOT NULL AND status != 'complate'),或将字段设置为 NOT NULL 并赋予默认值。
本文适用于从 MySQL 5.x 迁移到 8.0 后遇到查询异常的开发与运维人员。
迁云行动,MySQL由5.0迁移8.0,由MySQL语法更加的严谨,导致2023年有效的SQL变为无效的。
字段
status可空,status字段为NULL的数据,在MySQL8中没有返回
sqlSELECT *
FROM xxxx_log
WHERE `status` != 'complate';
| 查询条件示例 | 能否查出NULL值? | 说明 |
|---|---|---|
WHERE column_name != 'xxx' | ❌ 不能 | 这是你遇到的问题。因为NULL != 'xxx'的结果是NULL(未知),而非TRUE,所以行被过滤。 |
WHERE column_name = 'xxx' | ❌ 不能 | 同理,NULL = 'xxx'的结果也是NULL。 |
WHERE column_name IS NULL | ✅ 能 | 正确方法。专门用于判断NULL值。 |
WHERE column_name IS NOT NULL | ✅ 能 | 正确方法。专门用于判断非NULL值。 |
WHERE column_name IN ('value1', 'value2') | ❌ 不能 | 本质是多个=运算的集合,同样无法匹配NULL。 |
WHERE column_name NOT IN ('value1', 'value2') | ❌ 不能 | 如果集合中包含NULL值,整个查询会返回空结果集。 |
字段设置为非空


本文作者:Odboy
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC 4.0 BY-SA 许可协议。转载请注明出处!