必须用is null,= null永远查不到结果;因null是缺失标记,等值比较均返回unknown,where只保留true行。

WHERE IS NULL 是唯一可靠写法
在 phpMyAdmin 5.2 中执行 SQL 查询时,想筛出字段为数据库 NULL 的记录,必须用 IS NULL,写成 = NULL 或 != NULL 一定查不到任何结果。因为 SQL 标准规定:NULL 不参与等值比较,所有这类表达式都返回 UNKNOWN,而 WHERE 只保留 TRUE 行。
常见错误现象:
-
WHERE email = NULL→ 返回空结果集,哪怕该列全是 NULL -
WHERE status != 'done'→ 漏掉所有status IS NULL的行
正确写法示例:
SELECT * FROM users WHERE phone IS NULL; SELECT id, name FROM orders WHERE logistics_no IS NOT NULL;
注意:IS NOT NULL 不过滤空字符串 '' 或纯空格 ' ',它只认数据库层面的 NULL。
业务“空”要手动组合条件
实际业务中,“空”往往不只是 NULL,还包含 ''、' ' 等。phpMyAdmin 不会自动帮你合并语义,得自己拼 WHERE 条件。
实操建议:
- 排除 NULL 和空字符串:
WHERE phone IS NOT NULL AND phone != '' - 再剔除空白字符(MySQL/PostgreSQL):
WHERE phone IS NOT NULL AND TRIM(phone) != '' - SQL Server 需写成:
RTRIM(LTRIM(phone)) != '' - SQLite 的
TRIM()不支持多字符裁剪,但基础空格裁剪可用
别指望 phpMyAdmin 的「搜索」标签页或列过滤框能处理 TRIM —— 它们只做简单字符串匹配,对空格不敏感,也识别不了 NULL。
导出前过滤空值容易被分页截断
你在 SQL 标签页写了 SELECT * FROM logs WHERE data IS NOT NULL,执行后看到几百行,但点「导出」却发现只有前 30 行?这不是语法问题,是 phpMyAdmin 默认按分页限制导出当前页结果。
关键点:
- 导出按钮导出的是「当前渲染的结果集」,不是完整查询结果
- 即使你没写
LIMIT,phpMyAdmin 5.2 后台可能自动加LIMIT 1000防卡顿 - 解决办法:在 SQL 输入框里显式加上
LIMIT 0(表示不限制),再执行,然后点「全选所有 X 行」再导出 - 若看不到「全选所有」链接,说明
$cfg['MaxRows']被设得太小,或配置里禁用了该选项
导出格式也要当心:CSV 默认只导当前页;JSON 在 4.9+ 版本硬编码限 50 行;XML 把 NULL 序列化成 <value xsi:nil="true"></value>,部分解析器会直接跳过整行。
PHP 层清理空值不如 SQL 层预处理
如果你导出后还要用 PHP 处理(比如转 JSON 或生成报表),别依赖 array_filter($row) 清空值——它默认把 0、false、"0" 全干掉,而这些可能是合法数据。
更稳的做法是在 SQL 查询阶段就统一空值语义:
- 用
COALESCE(phone, '') AS phone把 NULL 转成空字符串,后续 PHP 就只需判断== '' - 用
NULLIF(TRIM(phone), '')把空白字符串转成 NULL,和数据库 NULL 统一处理 - 复杂嵌套结构(如 JSON 字段含空值)建议在 PDO fetch 时用
fetch(PDO::FETCH_ASSOC)+ 自定义回调预处理,而不是查完再扫数组
真正麻烦的从来不是怎么写,而是得先确认:这个“空”,在业务上到底代表没填、删了、还是系统压根没生成?混用 IS NULL、TRIM、empty(),漏数据比误筛更难排查。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











