繁体   English   中英

NULL如何存储在数据库中?

[英]How are NULLs stored in a database?

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

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


第一次尝试:

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

你能非常幸运并用它来检索NULL值吗?

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

第二次尝试:

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

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

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


看起来太容易了......

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

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

在PostgreSQL上,它使用一个可选的位图,每列一位(0为空,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而异。

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

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

;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM