是否存储位列中的空值?

时间:2018-11-28 06:29:57

标签: sql-server

位于https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-2017的Microsoft文档说:

  

整数数据类型,其值可以为1、0或NULL。

     

SQL Server数据库引擎优化了位列的存储。如果表中有8个或更少的位列,则这些列将存储为1个字节。如果存在9到16位列,则这些列将存储为2个字节,依此类推。   可以将字符串值TRUE和FALSE转换为位值:将TRUE转换为1,将FALSE转换为0。   转换为位会将任何非零值提升为1。

如何在单个位中存储1、0和NULL?

2 个答案:

答案 0 :(得分:1)

@MarkByers在有关SQL Server一般如何存储NULL的问题How much size “Null” value takes in SQL Server中引用了一个规范的答案:

  

除了存储空值所需的空间外,拥有可空列的开销也很大。对于每一行,每个可空列使用一位来标记该列的值是否为空。无论列是固定长度还是可变长度,都是如此。

因此,我希望BIT类型的行为与任何其他列相同,这意味着将有一个单独的位来跟踪该列是否为NULL或不是{{1 }}。因此,SQL Server中的NULL列实际上使用 two 位来跟踪这三个值。

答案 1 :(得分:1)

行标题中有一个NULL bitmap mask,用于跟踪哪些列为空。