Oracle、PostgreSQL、SQL Server中的NULL和空字符串的比较
2023-05-11 11:44 abce 阅读(484) 评论(0) 编辑 收藏 举报什么是NULL?
根据ANSI SQL-92规范,null既不是空字符串(对于字符或日期时间数据类型),也不是零值(对于数字数据类型)。为了确保所有null被统一处理,ANSI SQL-92规范规定所有数据类型的null必须是相同的。对于给定记录,当属性没有要存储的数据时,它由SQL值NULL表示。
Oracle、PostgreSQL、SQL Server中的NULL和空字符串
Oracle将NULL和空字符串都当作NULL来处理。Oracle需要一个byte来存储NULL。
PostgreSQL将NULL和空字符串分开处理,NULL是NULL,空字符串是空字符串。PostgreSQL不需要空间来存储NULL。
SQL Server也是将NULL和空字符串分开处理,NULL是NULL,空字符串是空字符串。SQL Server不需要空间来存储NULL。
NULL和空字符串上的唯一性约束
Oracle中,具有唯一性约束的列,可以包含任意数量的NULL和空字符串;而SQLServer中,只是允许有一个NULL、一个空字符串。对于NULL,PostgreSQL的处理方式类似Oracle,而对于空字符串,PostgreSQL的处理方式类似SQLServer。
Unique NULLS NOT DISTINCT语句
有意思的是,从PostgreSQL 15,可以使用nulls not distinct子句来防止将NULL作为不同的值。这就阻止了我们在唯一性约束列上插入多个NULL值。
1 2 3 4 5 6 7 8 9 | Treating NULLS as DISTINCT ################################# CREATE TABLE null_empty_test(a text, b text, UNIQUE (a)); INSERT INTO null_empty_test VALUES ( null ); INSERT 0 1 INSERT INTO null_empty_test VALUES ( null ); INSERT 0 1 |
下面来尝试一下15中的新特性
1 2 3 4 5 6 7 8 9 10 | Treating NULLS as NOT DISTINCT ################################# CREATE TABLE null_empty_test(a text, b text, UNIQUE NULLS NOT DISTINCT (a)); INSERT INTO null_empty_test VALUES ( null ); INSERT 0 1 postgres=# INSERT INTO null_empty_test VALUES ( null ); ERROR: duplicate key value violates unique constraint "null_empty_test_a_key" DETAIL: Key (a)=( null ) already exists. |
可以看到,报错显示插入了重复的值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2022-05-11 mongodb修改Read/Write tickets
2022-05-11 mysql用户报错Access denied; you need (at least one of) the SUPER privilege(s) for this operation