NULL 和空文本之间的区别

jo-*_*-so 4 postgresql null

我正在使用 Postgres。val text NULL CHECK(val <> '')使用(或varchar) 和之间在存储或性能方面是否有显着差异val text NOT NULL?文本不能为空。因此,空文本可以作为未设置的标记。但是,例如,根据存储情况,它有什么区别吗?

我知道,我失去了空文本的 NULL 魔法,但这并不重要。另一方面,我可以更轻松地导入应用程序,因为我不必处理NULL. 它只是字符串输入,字符串输出。

Lau*_*lbe 5

text和之间没有性能差异varchar

您的第一个列定义没有多大意义:要么将缺失值表示为空字符串或 NULL,所以要么使用

val text NOT NULL
Run Code Online (Sandbox Code Playgroud)

或与

val text CHECK (val <> '')
Run Code Online (Sandbox Code Playgroud)

空字符串比 NULL 值需要稍多的存储空间,但这不应该是决定因素。

我的建议是您根据丢失或空字符串的含义做出决定:

  • 如果你想表达“我知道这个值是空的”,那么使用空字符串

  • 如果你想表达“我不知道该值是什么,或者这个属性在这一行中没有意义”,请使用 NULL

但不要在不考虑查询的情况下做出决定。如果查询是“有多少行设置了该属性”,则使用 NULL 更有意义,因为您可以像这样查询:

SELECT count(attribute) FROM tab;
Run Code Online (Sandbox Code Playgroud)

而不是

SELECT count(*) FILTER (WHERE attribute <> '') FROM tab;
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您想知道哪些行的属性设置为“xyz”或根本没有设置,则空字符串会更好:

SELECT count(*) FROM tab WHERE attribute IN ('xyz, '');
Run Code Online (Sandbox Code Playgroud)

相对

SELECT count(*) FROM tab WHERE attribute = 'xyz' OR attribute IS NULL;
Run Code Online (Sandbox Code Playgroud)