Microsoft可以将三值字段存储在一个位中吗?

fen*_*mas 18 database sql-server null boolean bit-fields

我完全不了解SQL /数据库,但我和一位朋友聊天,他做了很多关于某些数据库使用"布尔"字段的数据库工作,除了true和false之外,该字段可以取值NULL.

关于这一点,他按照以下方式发表评论:"对于微软来说,他们从未将这种字段称为布尔值,他们只是稍微调用它.如果你有8个或更少的位字段,它就是一个真正的位置.在记录中,它只需要一个字节来存储它们."

当然,这对我来说似乎是不可能的 - 如果该字段可以容纳三个值,那么您将不会将其中的八个放入一个字节中.我的朋友一致认为这看起来很奇怪,但是对无知的低级内部构件表示无知,并且据他所知,从SQL端看这些字段可以容纳三个值,并且确实需要一个字节的存储空间.我想我们中的一个人有一根电线交叉.谁能解释一下这里到底发生了什么?

Nic*_*ver 21

我建议阅读本文以获得有关空存储的详细解释:SQL Server如何真正存储NULL-s.简而言之,null/not null位存储在不同的位置,即行的空位图.

来自文章:

对于允许空值的列,每行都有一个空位图.如果该列中的行为null,则位图中的位为1,否则为0.

因此,虽然8位列的实际存储在1个字节中,但是行的空位图中有额外的位指示该列是否为NULL ...所以取决于您的计数方式.为了完全准确,8位列使用2个字节,只分成2个不同的位置.


Cyl*_*Cat 7

空指示符是单独存储的,因此可空位实际上需要两位.严格来说,"null"不是第三个值; 它是一种占位符,它说:"这里可能有价值,但我们不知道它是什么." 因此,如果某个位为null,则可以将其与true进行比较,并且比较将失败,但您也可以将其与false进行比较,并且比较将失败.