Database 空值如何存储在数据库中?

Database 空值如何存储在数据库中?,database,null,Database,Null,我很想知道空值是如何存储到数据库中的 这当然取决于数据库服务器,但我想大致了解一下 第一次尝试: 假设服务器将未定义的值(可以是任何值)放入空值字段中 您是否可以非常幸运地使用 ...WHERE field = 'the undefined value (remember, could be anything...)' 第二次尝试: 服务器是否有标志或任何元数据指示此字段为空 然后服务器必须读取此元数据以验证字段 如果元数据指示空值,并且如果查询没有“字段为空”, 然后该记录被忽略 这似

我很想知道空值是如何存储到数据库中的

这当然取决于数据库服务器,但我想大致了解一下


第一次尝试:

假设服务器将未定义的值(可以是任何值)放入空值字段中

您是否可以非常幸运地使用

...WHERE field = 'the undefined value (remember, could be anything...)'

第二次尝试:

服务器是否有标志或任何元数据指示此字段为空

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

如果元数据指示空值,并且如果查询没有“字段为空”, 然后该记录被忽略



这似乎太简单了……

服务器通常使用元信息而不是神奇的值。所以这里有一个位置,指定字段是否为空


-Adam

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


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

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

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

参考资料:


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

ibmdb2forlinux,Unix,Windows使用额外的字节来存储空指示符;好吧,它对每个可为空的字段使用一个单独的字节,但在这个细节上我可能错了


因此,正如前面所指出的,机制因DBMS的不同而不同。

使用特殊值来指示NULL的问题在于,迟早会插入该特殊值。例如,它将被插入到一个表中,为不同的数据库服务器指定特殊的空指示符

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

;-)

服务器确实有某种标志,并且服务器读取元数据以验证字段。仅仅因为该值为NULL,并不意味着该记录被忽略——原因很多(通常很复杂)。