Man*_*ero 100 null empty-string feature-comparison
我主要对 MySQL 和 PostgreSQL 感兴趣,但您可以大致回答以下问题:
将空字符串存储为...的物理存储含义是什么?
小智 77
假设记录来自用于收集姓名和地址信息的表单。如果用户不住在公寓里,地址的第 2 行通常是空白的。在这种情况下,空字符串是完全有效的。我倾向于使用 NULL 来表示该值未知或未给出。
我不认为物理存储差异在实践中值得担心。作为数据库管理员,我们有更大的鱼要煎!
ber*_*d_k 28
我对 MySQL 和 PostgreSQL 一无所知,但让我一般地处理一下。
有一个 DBMS 即 Oracle,它不允许在 NULL 和 '' 之间选择它的用户。这清楚地表明没有必要区分两者。有一些令人讨厌的后果:
您将 varchar2 设置为空字符串,如下所示:
Update mytable set varchar_col = '';
Run Code Online (Sandbox Code Playgroud)
以下导致相同的结果
Update mytable set varchar_col = NULL;
Run Code Online (Sandbox Code Playgroud)
但是要选择值为空或NULL的列,您必须使用
select * from mytable where varchar_col is NULL;
Run Code Online (Sandbox Code Playgroud)
使用
select * from mytable where varchar_col = '';
Run Code Online (Sandbox Code Playgroud)
在语法上是正确的,但它永远不会返回一行。
另一方面,在 Oracle 中连接字符串时。NULL varchars 被视为空字符串。
select NULL || 'abc' from DUAL;
Run Code Online (Sandbox Code Playgroud)
产生abc。在这些情况下,其他 DBMS 将返回 NULL。
当你想明确表达一个值被赋值时,你必须使用像''这样的东西。
而且您必须担心修剪不为空是否会导致 NULL
select case when ltrim(' ') is null then 'null' else 'not null' end from dual
Run Code Online (Sandbox Code Playgroud)
确实如此。
现在查看 DBMS,其中 '' 与 NULL 不同(例如 SQL-Server)
使用 '' 通常更容易,并且在大多数情况下实际上没有必要区分两者。我知道的例外之一是,当您的列代表某些设置并且您没有为它们设置空默认值时。当您可以区分 '' 和 NULL 时,您就可以表示您的设置为空并避免应用默认值。
Gan*_*Gan 17
这取决于您正在处理的域。NULL表示没有值(即没有值),而空字符串表示存在长度为零的字符串值。
例如,假设您有一个表来存储一个人的数据,它包含一Gender列。您可以将值保存为“男”或“女”。如果用户可以选择不提供性别数据,您应该将其另存为NULL(即用户未提供值)而不是空字符串(因为没有值为 '' 的性别)。
小智 11
值得记住的一件事是,当您有一个不需要的字段,但存在的任何值必须是唯一的时,将要求您将空值存储为 NULL。否则,您将只能在该字段中有一个空值的元组。
关系代数和 NULL 值也有一些差异:例如,NULL != NULL。
您还可以考虑 Date 对 NULL 的批评以及SQL 和关系理论中 3VL 的问题(以及 Rubinson 对 Date 批评、Nulls 、三值逻辑和 SQL 中的歧义的批评:Critiqueing Date's Critique)。
两者都在相关的 SO 线程中进行了详细的引用和讨论,用于从数据库模型中消除可空列的选项。
| 归档时间: |
|
| 查看次数: |
100239 次 |
| 最近记录: |