0

0

SQL 中 NULL 与空字符串 ‘’ 的比较行为差异汇总

舞姬之光

舞姬之光

发布时间:2026-01-28 21:08:42

|

134人浏览过

|

来源于php中文网

原创

NULL与''在SQL中行为截然不同:WHERE col = NULL恒不成立,须用IS NULL;空字符串用= ''匹配;聚合函数对二者处理差异大,需用NULLIF或COALESCE统一处理。

sql 中 null 与空字符串 \'\' 的比较行为差异汇总

NULL 与 '' 在 WHERE 条件中的行为完全不同

直接写 WHERE col = '' 能命中空字符串,但 WHERE col = NULL 永远不返回任何行——因为 SQL 中任何与 NULL 的等值比较(=!=)结果都是 UNKNOWN,而 WHERE 只接受 TRUE

NULL 必须用 IS NULL,查非空字符串且排除 NULL 得写成:col != '' AND col IS NOT NULL

  • col = '':只匹配存储值为零长度字符串的行
  • col IS NULL:只匹配该列未赋值或显式设为 NULL 的行
  • col = NULLcol != NULL:语法合法,但逻辑恒为假,无实际筛选效果
  • 某些 ORM(如 Django)自动生成的查询可能混淆二者,需检查生成 SQL

聚合函数对 NULL 和 '' 的处理差异

COUNT(col) 忽略 NULL,但会计入 ''SUM()AVG()MAX()MIN() 全部跳过 NULL,却把 '' 当作有效值参与计算——这在字符类型上通常报错(如 SUM('') 在 PostgreSQL 报 invalid input syntax for type numeric),但在 MySQL 的宽松模式下可能隐式转为 0,造成静默偏差。

  • COUNT(*) 统计所有行,COUNT(col) 只统计 col IS NOT NULL 的行
  • COALESCE(col, 'N/A') 可统一兜底,但注意:若 col'',不会触发替换
  • NULLIF(col, '') 可把空字符串转为 NULL,再配合聚合更安全

ORDER BY 中 NULL 和 '' 的排序位置受方言控制

标准 SQL 规定 NULLS FIRST / NULLS LAST,但 MySQL 默认把 NULL 排最前,PostgreSQL 默认排最后;而 '' 始终按字典序参与排序,和普通字符串一样。这意味着 ORDER BY name 的结果在不同数据库里,NULL 行的位置可能上下翻转,但 '' 行总在 'a' 前、' ' 后(因 ASCII 值为 0)。

BibiGPT-哔哔终结者
BibiGPT-哔哔终结者

B站视频总结器-一键总结 音视频内容

下载
  • MySQL 8.0+ 支持显式 NULLS LAST,但旧版只能靠 ORDER BY IF(col IS NULL, 1, 0), col 模拟
  • ''' '(空格)不是一回事:LENGTH(' ') 是 1,LENGTH('') 是 0
  • 前端分页时若依赖排序稳定性,必须明确处理 NULL 位置,否则同一页数据可能重复或丢失

INSERT 和 DEFAULT 对 NULL 与 '' 的隐式转换风险

定义列为 TEXT DEFAULT '' 时,显式插入 NULL 会存成 NULL(除非加 NOT NULL 约束);但若列定义为 TEXT DEFAULT NULL,又没指定值,才真正存 NULL。更大的陷阱是某些客户端或 ORM 在字段为空时自动发 '' 而非 NULL,导致业务上“未填写”被记为“填了空值”。

  • 建表时优先用 NOT NULL DEFAULT '' 明确语义,避免歧义
  • MySQL 的 STRICT_TRANS_TABLES 模式下,向 NOT NULL 列插入 '' 是允许的;但插入 NULL 会报错
  • 从 CSV 导入时,缺失字段常被解析为 NULL,而空字段(,,)可能是 '',需预处理统一

真正麻烦的不是记不住规则,而是同一个字段在应用层、ORM 层、DB 层、迁移脚本里可能被不同方式初始化或校验——NULL'' 看似微小,一旦混用,查数、统计、导出全会偏移。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

727

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

350

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1243

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

360

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

820

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

423

2024.04.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 812人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号