NULL如何存储在数据库中?

时间:2008-10-31 16:41:29

标签: database null

我很想知道如何将NULL存储到数据库中?

这肯定取决于数据库服务器,但我想对它有一个大概的想法。


首先尝试:

假设服务器将未定义的值(可能是任何值)放入字段中以获取NULL值。

你能非常幸运并使用

检索NULL值
...WHERE field = 'the undefined value (remember, could be anything...)'

第二次尝试:

服务器是否有某个标志或某个元数据表明此字段为空?

然后服务器必须读取此元数据以验证该字段。

如果元数据指示NULL值,并且查询没有“field IS NULL”, 然后忽略记录。


这似乎太容易了......

5 个答案:

答案 0 :(得分:9)

MySql使用第二种方法。它存储一个位数组(每列一个),每行包含数据,以指示哪些列为空,然后将该字段的数据留空。我很确定这对所有其他数据库也是如此。

第一种方法的问题是,您确定为数据选择的任何值都不会显示为有效数据吗?对于某些值(如日期或浮点数),这是真的。对于其他人(如整数),这是错误的。

答案 1 :(得分:3)

在PostgreSQL上,它使用一个可选的位图,每列一位(0为空,1不为空)。如果位图不存在,则所有列都不为空。

这与数据本身的存储完全分开,但与行位于同一页面上(因此行和位图一起读取)。

参考文献:

答案 2 :(得分:2)

服务器通常使用元信息而不是魔术值。所以有一些地方指出该字段是否为空。

- 亚当

答案 3 :(得分:1)

IBM Informix Dynamic Server使用特殊值来指示空值。例如,SMALLINT(16位,有符号)的有效值范围是-32767 .. + 32767。另一个值-32768保留为表示NULL。类似地,对于INTEGER(4字节,有符号)和BIGINT(8字节,有符号)。对于其他类型,它使用其他特殊表示(例如,SQL FLOAT和SMALLFLOAT的所有位1 - 分别为C double和float)。这意味着它不必使用额外的空间。

IBM DB2 for Linux,Unix,Windows使用额外的字节来存储空指示符; AFAIK,它为每个可空字段使用一个单独的字节,但我可能在这个细节上错了。

因此,正如所指出的,机制因DBMS而异。

答案 4 :(得分:1)

特殊值表示NULL的问题是迟早会插入特殊值。例如,它将插入到表中,指定不同数据库服务器的特殊NULL指示符

| DBServer     | SpecialValue |
+--------------+--------------+
| 'Oracle'     | 'Glyph'      |
| 'SQL Server' | 'Redmond'    |

- )