暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle vs PostgreSQL vs SQL Server 中的空字符串 - PostgreSQL迁移

原创 小小亮 2023-02-02
699

通过Akhil Reddy Banappagari /迁移到 PostgreSQLOracle 到 PostgreSQLPostgreSQL / Oracle 到 PostgreSQLPostgreSQLSQL Server 到 PostgreSQL2023 年 2 月 1 日

当某些差异未知时,从Oracle 到 PostgreSQL以及从SQL Server 到 PostgreSQL的数据库迁移可能会变得棘手。未知差异可能导致迁移失败。我们之前已经在博客中介绍了Oracle 与 SQL Server 和 PostgreSQL 之间DATE 数据类型事务控制语句的行为。在本文中,我们将讨论具有唯一约束的 Oracle、PostgreSQL 和 SQL Server 中 NULL 和空字符串的行为。这是我们关于在从 Oracle 迁移到 PostgreSQL 以及从 SQL Server 迁移到 PostgreSQL 期间处理 NULLS 的系列文章中的第一篇。

什么是 NULL ?

根据 ANSI SQL-92 规范,null 既不是空字符串(对于字符或日期时间数据类型),也不是零值(对于数字数据类型)。为确保统一处理所有空值,ANSI SQL-92 规范规定所有数据类型的空值必须相同。当给定记录的属性没有要存储的数据时,它由 SQL 值 NULL 表示。

Oracle vs PostgreSQL vs SQL Server 中的 NULL 和空字符串

Oracle 将 NULL 和n 空字符串都视为 NULL。PostgreSQL 将 NULL 视为 NULL,将空字符串视为空字符串。与 PostgreSQL 类似,SQL Server 也将 NULL 视为 NULL,将空字符串视为空字符串。

Oracle 需要一个字节来存储 NULL。而 PostgreSQL 和 SQL Server 都不需要任何空间来存储 NULL。

NULL 和空字符串的 UNIQUE 约束

在 Oracle 中,存在唯一约束的列可以存储任意数量的 NULL 条目和空字符串。

但是,SQL Server 只允许在存在唯一约束的列中插入一个 NULL 和一个 Empty String。

在 PostgreSQL 中,允许插入多个类似 Oracle 的 NULL 实体。与 SQL Server 类似,PostgreSQL 仅在该列存在唯一约束时才允许一个空字符串。

唯一的 NULLS NOT DISTINCT 子句

有趣的是,从 PostgreSQL 15 开始,我们可以使用NULLS NOT DISTINCT子句来防止空值被处理为不同的。这可以防止我们将多个空值插入到具有唯一约束的列中。

让我们考虑以下示例,我们正在创建一个表并将多个 NULL 值插入到具有唯一约束的同一列。


Treating NULLS as DISTINCT
#################################
CREATE TABLE _migopstest.null_empty_test(a text, b text, UNIQUE(a));

INSERT INTO _migopstest.null_empty_test VALUES(null);
INSERT 0 1

INSERT INTO _migopstest.null_empty_test VALUES(null);
INSERT 0 1


我们现在将尝试 PostgreSQL 15 中添加的新功能,以将 NULL 视为不可区分的。这是通过为相应的列包含一个附加子句来完成的:UNIQUE NULLS NOT DISTINCT。

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.


在上面的示例中,我们可以注意到在插入重复的 NULL 条目时由 PostgreSQL 触发的错误。这是 PostgreSQL 15 提供的一项功能,可以在需要时显式启用。


原文标题:Null and Empty string in Oracle vs PostgreSQL vs SQL Server

原文作者:Akhil Reddy Banappagari

原文链接:https://www.migops.com/blog/null-and-empty-string-in-oracle-vs-postgresql-vs-sql-server/


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

P
暂无图片
获得了6次点赞
暂无图片
内容获得1次评论
暂无图片
获得了18次收藏