通过Akhil Reddy Banappagari /迁移到 PostgreSQL,Oracle 到 PostgreSQL,PostgreSQL / Oracle 到 PostgreSQL,PostgreSQL,SQL Server 到 PostgreSQL / 2023 年 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/