编辑
2025-09-23
数据库-MySQL
00
请注意,本文编写于 199 天前,最后修改于 0 天前,其中某些信息可能已经过时。

目录

背景
例子
查询资料
解决方案

从 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中没有返回

sql
SELECT * 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值,整个查询会返回空结果集。

解决方案

字段设置为非空

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Odboy

本文链接:

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