Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Microsoft能否在一个位中存储三个值字段?_Sql Server_Database_Null_Boolean_Bit Fields - Fatal编程技术网

Sql server Microsoft能否在一个位中存储三个值字段?

Sql server Microsoft能否在一个位中存储三个值字段?,sql-server,database,null,boolean,bit-fields,Sql Server,Database,Null,Boolean,Bit Fields,我完全不知道SQL/数据库,但我和一位做了大量数据库工作的朋友聊天,他谈到一些数据库如何使用一个“布尔”字段,除了true和false之外,还可以接受NULL值 关于这一点,他这样评论:“值得赞扬的是,微软从来没有将这种字段称为布尔值,他们只是称它为一个位。它是一个真正的位——如果一条记录中有八个或更少的位字段,那么只需要一个字节就可以存储它们。” 当然,这对我来说似乎是不可能的——如果字段可以容纳三个值,那么一个字节就不能容纳八个值。我的朋友也认为这看起来很奇怪,但他乞求对底层的内部结构一无所

我完全不知道SQL/数据库,但我和一位做了大量数据库工作的朋友聊天,他谈到一些数据库如何使用一个“布尔”字段,除了true和false之外,还可以接受NULL值

关于这一点,他这样评论:“值得赞扬的是,微软从来没有将这种字段称为布尔值,他们只是称它为一个位。它是一个真正的位——如果一条记录中有八个或更少的位字段,那么只需要一个字节就可以存储它们。”


当然,这对我来说似乎是不可能的——如果字段可以容纳三个值,那么一个字节就不能容纳八个值。我的朋友也认为这看起来很奇怪,但他乞求对底层的内部结构一无所知,并说据他所知,从SQL方面看,这样的字段可以包含三个值,并且需要一个字节的存储空间。我想我们中的一个人有一条交叉线。有人能解释一下这里到底发生了什么吗?

空指示符是分开存储的,所以一个可空位实际上需要两个位。严格地说,“null”不是第三个值;这是一种占位符,上面写着,“这里可能有一个值,但我们不知道它是什么。”因此,如果位为null,您可以将其与true进行比较,比较将失败,但也可以将其与false进行比较,比较将失败。

您是正确的。您可以将八个真/假值打包到一个字节中,但仍然需要额外的存储来指示它是否为NULL。仅用28个表示38个不同的状态是不可能的。

我建议阅读本文,以便更好地解释空存储:。简而言之,空/非空位存储在另一个位置,即行的空位图

从文章中:

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


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

您的朋友是对的,但同时也是错的。一个位字段可以被视为能够维护三个不同的值,但根据定义,NULL表示没有值


此外,允许位字段为NULL意味着该字段将使用2位(一位用于值,一位用于是否为NULL)。但是字段的空状态(空位)存储在行的位图中,而不是给定列的确切内存空间中

其他人已经说过BIT需要2位,而不是1位


另一个经常被遗忘的要点是:SQL Server中的位不是布尔或逻辑数据类型;它是数字(整数)数据类型。位仅支持数字运算符(,+,-)。它不支持任何逻辑运算符(AND、OR、not等)。

Jon Skeet可以在一个位中存储三值字段。Gaahhhh我早就知道了!啊,我想一定是这样的。感谢链接到血淋淋的细节!你的声誉提升必须是所有人中提升率最高的一个。我对你的代表图的斜率很感兴趣@米奇-哈哈,我已经有一段时间没查了,这很酷,谢谢你指出:)