【问题标题】:How are NULLs stored in a database?NULL 是如何存储在数据库中的?
【发布时间】:2008-10-31 16:41:28
【问题描述】:

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

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


第一次尝试:

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

你能不能很幸运并用

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

第二次尝试:

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

那么服务器必须读取这个元数据来验证字段。

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


好像太简单了……

【问题讨论】:

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

标签: database null


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    参考资料:

    【讨论】:

      【解决方案3】:

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

      -亚当

      【讨论】:

        【解决方案4】:

        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 而异。

        【讨论】:

          【解决方案5】:

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

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

          ;-)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-09-11
            • 2015-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多