Oracle/PostgreSQL/SQL Server NULL 与空字符串差异

news/2025/11/28 9:29:13/文章来源:https://www.cnblogs.com/shujuyr/p/19280264

Oracle/PostgreSQL/SQL Server NULL 与空字符串差异

在 SQL 开发中,NULL 和空字符串('')的处理是高频踩坑点。不同数据库对两者的定义、存储方式及约束支持存在显著差异,若不明确这些区别,容易导致数据查询异常、约束冲突等问题。本文基于 ANSI SQL-92 规范,结合 Oracle、PostgreSQL、SQL Server 的特性,详解三者在 NULL 与空字符串处理上的核心差异及实操注意事项。

一、基础概念:NULL 与空字符串的本质区别

根据 ANSI SQL-92 规范,NULL 和空字符串是完全不同的概念:
 
  • NULL:表示 “缺失的值” 或 “未知的值”,不对应任何具体数据(既非空串,也非数字 0),所有数据类型的 NULL 定义统一。
  • 空字符串(''):属于明确的字符串类型值,长度为 0,仅适用于字符类数据类型(如 VARCHAR、TEXT)。
 
三者的核心差异集中在 “是否区分两者”“存储需求”“唯一性约束处理” 三个维度,具体如下:

二、核心差异对比(表格汇总)

对比维度OraclePostgreSQLSQL Server
本质区分 不区分,均视为 NULL 严格区分,NULL≠空字符串 严格区分,NULL≠空字符串
存储空间 需 1 字节存储 NULL(含空字符串) 无需空间存储 NULL,空字符串需占用存储 无需空间存储 NULL,空字符串需占用存储
唯一性约束(NULL) 允许插入任意多个 NULL 15 版本前允许多个 NULL;15 + 支持NULLS NOT DISTINCT限制单个 NULL 仅允许插入 1 个 NULL
唯一性约束(空字符串) 视为 NULL,允许任意多个 视为明确值,仅允许 1 个空字符串 视为明确值,仅允许 1 个空字符串
等值比较(NULL vs 空串) NULL = '' 结果为 NULL(不成立) NULL = '' 结果为 NULL(不成立) NULL = '' 结果为 NULL(不成立)

关键差异补充说明

  1. Oracle 的 “合并处理” 特性:Oracle 是唯一不区分 NULL 和空字符串的数据库,插入''会自动转为 NULL,查询时无法通过column = ''筛选空串,需用IS NULL判断。
  2. PostgreSQL 的版本特性:15 版本前对 NULL 的唯一性约束逻辑与 Oracle 一致(允许多个 NULL),15 版本新增UNIQUE NULLS NOT DISTINCT语法,可将 NULL 视为重复值限制插入数量。
  3. SQL Server 的 “严格区分” 特性:NULL 和空字符串完全独立,不仅存储分离,唯一性约束也分别生效(1 个 NULL + 1 个空字符串可共存,但无法插入第二个 NULL 或第二个空字符串)。

三、实操场景示例(附 SQL 代码)

场景 1:插入 NULL 与空字符串的效果

1. Oracle

 
-- 创建测试表
CREATE TABLE oracle_test (col VARCHAR2(20));
-- 插入空字符串(自动转为NULL)
INSERT INTO oracle_test VALUES ('');
-- 插入NULL
INSERT INTO oracle_test VALUES (NULL);
-- 查询结果:两条记录均为NULL
SELECT col, col IS NULL AS is_null FROM oracle_test;
-- 输出:(NULL, TRUE)、(NULL, TRUE)
 

2. PostgreSQL(15 版本前)

 
CREATE TABLE pg_test (col TEXT);
-- 插入空字符串
INSERT INTO pg_test VALUES ('');
-- 插入NULL
INSERT INTO pg_test VALUES (NULL);
-- 查询结果:空字符串与NULL分离
SELECT col, col IS NULL AS is_null, col = '' AS is_empty FROM pg_test;
-- 输出:('', FALSE, TRUE)、(NULL, TRUE, FALSE)
 

3. SQL Server

CREATE TABLE mssql_test (col VARCHAR(20));
-- 插入空字符串
INSERT INTO mssql_test VALUES ('');
-- 插入NULL
INSERT INTO mssql_test VALUES (NULL);
-- 查询结果:与PostgreSQL一致
SELECT col, col IS NULL AS is_null, col = '' AS is_empty FROM mssql_test;
-- 输出:('', 0, 1)、(NULL, 1, 0)
 

场景 2:唯一性约束的差异表现

1. Oracle(允许多个 NULL / 空字符串)

 
CREATE TABLE oracle_unique_test (col VARCHAR2(20) UNIQUE);
-- 插入多个NULL(成功)
INSERT INTO oracle_unique_test VALUES (NULL);
INSERT INTO oracle_unique_test VALUES (NULL);
-- 插入多个空字符串(视为NULL,成功)
INSERT INTO oracle_unique_test VALUES ('');
INSERT INTO oracle_unique_test VALUES ('');
-- 无报错,表中存在4条NULL记录
 

2. PostgreSQL 15+(限制多个 NULL)

-- 启用NULLS NOT DISTINCT约束
CREATE TABLE pg_unique_test (col TEXT, UNIQUE NULLS NOT DISTINCT (col));
-- 插入第一个NULL(成功)
INSERT INTO pg_unique_test VALUES (NULL);
-- 插入第二个NULL(报错:重复键)
INSERT INTO pg_unique_test VALUES (NULL);
-- 报错信息:ERROR: duplicate key value violates unique constraint "pg_unique_test_col_key"
 

3. SQL Server(仅允许 1 个 NULL 和 1 个空字符串)

CREATE TABLE mssql_unique_test (col VARCHAR(20) UNIQUE);
-- 插入1个NULL(成功)
INSERT INTO mssql_unique_test VALUES (NULL);
-- 插入第二个NULL(报错)
INSERT INTO mssql_unique_test VALUES (NULL);
-- 报错信息:违反唯一约束,不能插入重复键-- 插入1个空字符串(成功,与NULL不冲突)
INSERT INTO mssql_unique_test VALUES ('');
-- 插入第二个空字符串(报错)
INSERT INTO mssql_unique_test VALUES ('');
-- 报错信息:违反唯一约束,不能插入重复键
 

四、开发避坑指南

  1. 查询时避免用=判断 NULL:所有数据库中col = NULL的结果均为 NULL(不成立),需用col IS NULL查询 NULL 值,用col = ''查询空字符串(PostgreSQL/SQL Server)。
  2. Oracle 中统一用IS NULL判断空值:因 Oracle 将空字符串转为 NULL,无需区分''和 NULL,直接用col IS NULL即可筛选所有 “空值” 场景。
  3. PostgreSQL 15 + 注意约束语法:若需限制 NULL 的唯一性,使用UNIQUE NULLS NOT DISTINCT;若需兼容旧版本,避免依赖多 NULL 插入逻辑。
  4. 数据迁移时的兼容性处理:
    • 从 Oracle 迁移到 PostgreSQL/SQL Server:需将原表中''替换为 NULL(或明确保留空字符串),避免约束冲突。
    • 从 PostgreSQL/SQL Server 迁移到 Oracle:无需额外处理,Oracle 会自动兼容两者的存储逻辑。

五、总结

三大数据库对 NULL 和空字符串的处理核心差异源于 “是否区分两者”:Oracle 为简化逻辑合并处理,PostgreSQL 和 SQL Server 则严格遵循 ANSI 规范分离处理。开发中需重点关注:
 
  • 存储需求:仅 Oracle 的 NULL(含空字符串)占用 1 字节,其余两者的 NULL 不占存储。
  • 约束规则:唯一性约束对 NULL 和空字符串的限制逻辑因数据库而异,尤其注意 PostgreSQL 15 + 的版本特性。
  • 查询语法:统一使用IS NULL判断 NULL 值,避免=运算符导致的逻辑错误。
 
明确这些差异后,可有效避免跨数据库开发、数据迁移中的常见问题,确保 SQL 逻辑的一致性和准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/979262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年度比较不错的GEO优化品牌企业、服务不错的GEO优

在AI搜索重塑流量格局的时代,企业能否在AI生成答案中占据标准答案位置,直接决定了获客效率与品牌影响力。面对市场上良莠不齐的GEO优化服务,如何选择专业可靠的伙伴?以下为你盘点2025年五大的GEO优化品牌,助你抢占…

【攻防实战】通达OA文件上传联动Cobalt Strike打穿三层内网(上) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年新疆旅游公司权威推荐榜单:旅游攻略/阿勒泰旅游/喀纳斯旅游旅行社精选

新疆作为中国西北地区的旅游重要目的地,旅游业发展持续加速。据2025年旅游行业数据显示,新疆全年接待游客量已突破2.5亿人次,旅游总收入达2100亿元,同比增长18%。随着旅游市场扩大,专业旅游服务成为保障旅行品质的…

2025年中国十大AI营销双引擎系统公司推荐:讯灵繁星GEO

本榜单基于AI营销技术落地能力、客户增长实效、行业口碑三大核心维度,筛选出国内AI搜索营销领域标杆企业,为B端企业布局AI流量新赛道提供客观选型参考。 TOP1 推荐:广州讯灵繁星科技服务有限公司 推荐指数:★★★…

神秘顾客项目:企业服务监测的利器

在当今竞争激烈的商业环境中,企业对于提升服务质量、了解真实客户体验的需求愈发迫切。神秘顾客项目,作为一种专业的市场调研方法,正逐渐成为企业提升服务水平的重要手段。 神秘顾客项目的行业优势 神秘顾客项目具有…

2025年石膏板厂家权威推荐榜单:轻钢龙骨/瓷砖胶/阻燃板源头厂家精选

石膏板作为现代建筑装饰的重要材料,其市场需求持续增长。根据2025年建筑装饰行业数据显示,中国石膏板市场规模已达485亿元,其中隔墙用石膏板占比42%,吊顶用石膏板占比35%,特种功能石膏板占比23%。随着绿色建筑标准…

2025 年耐火砖生产厂家联系方式完整汇总,全国重点企业官方联系方式与高效采购指南

引言 本文基于 2025 年耐火砖行业公开数据和权威第三方报告,结合行业内重点企业的生产实力、产品质量、服务水平等核心维度,从专业能力、服务稳定性、资源网络等方面严格筛选出 5 家优质生产厂家,旨在为陶瓷、冶金、…

安全合规双在线,好用的跨网文件安全交换系统成企业首选

在数字化转型加速的今天,企业内部不同安全域、内外网之间的文件交换日益频繁,但网络隔离与数据互通的矛盾始终存在。跨网文件安全交换系统是专门用于不同网络环境(如内网与外网、生产网与办公网、不同安全级别网络)…

2025 年烧结砖生产厂家联系方式完整汇总,全国重点企业官方联系方式与高效采购指南

引言 本文基于 2025 年烧结砖行业公开数据和权威第三方报告,结合各生产厂家的专业能力、服务稳定性、资源网络等核心维度,从众多企业中严格筛选出 5 家综合实力突出的烧结砖生产厂家。这些厂家在产品品质、产能供应、…

LLM应用剖析: 热点新闻助手TrendRadar

项目的初衷主要是通过聚合的35+新闻资讯,然后通过用户自定义关键词等策略实现个性化推送,想要学习资讯榜单爬取、多端推送以及构建MCP服务的读者,可以学之以用。1. 背景花了近三天时间,深入研究了Github近几天一直…

2025年新疆租车公司权威推荐榜单:新疆租皮卡车/新疆租车网/新疆乌鲁木齐租车源头公司精选

新疆作为中国西北地区的重要旅游和商务目的地,租车服务需求持续增长。根据2025年旅游交通行业数据显示,新疆租车市场规模已达12亿元,其中旅游租车占比58%,商务租车占比25%,特殊项目用车占比17%。随着新疆旅游业的…

深入解析:Axure高保真View Design框架元件库

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年河北实木全屋定制品牌口碑排行榜,三木全屋定制市场口

为帮消费者高效锁定适配自身需求的实木全屋定制品牌,避免选购走弯路,我们从品牌规模实力、产品工艺品质、定制服务效率、环保安全认证及真实用户口碑五大维度,对河北及周边区域多家服务商展开深度评估,终筛选出202…

神秘顾客调研费用哪家便宜?优加市场调研服务性价比高值得选

在当今竞争激烈的商业环境中,神秘顾客暗访已经成为众多企业提升服务质量、了解真实市场反馈的重要手段。那么,神秘顾客暗访究竟有哪些优势和特点?费用如何?又该如何选择靠谱的服务品牌呢? 神秘顾客暗访的行业优势…

CI流程中关键环节的缩写,比如cl ut Host List是什么意思 ?

1. CL - Change List (变更列表)是什么:指代一次代码提交/一个变更集。这是最核心的概念,代表你修改的所有文件的集合。来源:这个词源于 Perforce 版本控制系统,但现在已被广泛使用(尤其是在Google等公司),基…

物联网小程序开发公司,物联网小程序开发公司3家实力厂商详解:含支付宝小程序/微信小程序/北京小程序/物业小程序/活动小程序/抖音小程序开发公司推荐

在万物互联的时代浪潮下,物联网(IoT)技术正以前所未有的速度改变着传统行业的运营模式与服务形态。物联网小程序,作为连接物理世界与数字服务的关键纽带,因其轻量化、易触达、强交互的特性,正成为众多企业实现智…

【出版 | 检索】

由中国石油大学主办,中国民航大学作为支持单位的第五届计算建模、仿真与数据分析国际学术会议(CMSDA 2025)将于2025年12月12-14日即将在中国青岛召开。【】 第五届计算建模、仿真与数据分析国际学术会议(CMSDA 2025) …

2025年钢板防护罩厂家权威推荐榜单:CNC机床防尘罩/链板排屑机/盔甲防护罩源头厂家精选

钢板防护罩作为机床和工业设备的关键防护部件,其质量直接关系到设备寿命与加工精度。据2025年行业数据显示,国内机床防护罩市场规模已达87亿元,其中钢板防护罩占比45%,成为工业设备不可或缺的配套产品。以下基于20…

2025年中央空调品牌畅销的有哪些?家用中央空调制造商推荐,

在全球双碳目标与消费升级的双重驱动下,中央空调已从配置转向品质生活标配。面对市场上琳琅满目的中央空调产品,如何选择技术可靠、能效突出、适配性强的品牌?本文依据畅销度、技术实力、用户口碑三大维度,盘点202…

Solon 不依赖 Java EE 是最有价值的设计!

Solon框架通过摒弃Java EE规范依赖,构建了一个轻量高效的微服务开发平台。其设计优势体现在:1)彻底轻量化,实现极速启动和低资源占用;2)容器中立性,灵活适配多种网络I/O技术;3)专注核心功能,简化开发复杂度;…