11

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

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


第一次尝试:

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

您能否非常幸运并使用以下方法检索 NULL 值

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

第二次尝试:

服务器是否在某处有标志或任何元数据来指示该字段为 NULL ?

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

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


好像太容易了...

4

5 回答 5

10

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

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

于 2008-10-31T16:45:05.033 回答
5

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

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

参考:

于 2008-10-31T16:55:49.800 回答
2

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

-亚当

于 2008-10-31T16:44:16.500 回答
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 而异。

于 2008-11-01T07:04:19.650 回答
1

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

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

;-)

于 2008-11-05T21:12:40.137 回答