我正在使用 Postgres。val text NULL CHECK(val <> '')
使用(或varchar
) 和之间在存储或性能方面是否有显着差异val text NOT NULL
?文本不能为空。因此,空文本可以作为未设置的标记。但是,例如,根据存储情况,它有什么区别吗?
我知道,我失去了空文本的 NULL 魔法,但这并不重要。另一方面,我可以更轻松地导入应用程序,因为我不必处理NULL
. 它只是字符串输入,字符串输出。
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)
归档时间: |
|
查看次数: |
9570 次 |
最近记录: |