代码之家  ›  专栏  ›  技术社区  ›  Luc M

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

  •  9
  • Luc M  · 技术社区  · 16 年前

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


    第一次尝试:

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

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

    第二次尝试:

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

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

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


    这似乎太容易了。。。

    5 回复  |  直到 12 年前
        1
  •  10
  •   Thomas Jones-Low    16 年前

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

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

        2
  •  5
  •   CesarB    16 年前

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

    参考资料:

        3
  •  2
  •   Adam Davis    16 年前

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

    -亚当

        4
  •  1
  •   Jonathan Leffler    16 年前

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

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

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

        5
  •  1
  •   Bjarke Ebert    16 年前

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

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

    ;-)