Tinyint vs Bit

我不想在这里触发一场宗教战争,但是如何在数据库中表示布尔值似乎有两种想法。 有人说bit是合适的数据types,而另一些人则认为tinyint更好。

我知道的唯一区别是这些:

  • bit :存储大小是1位,可能的值是0或1
  • tinyint :存储大小是1个字节,可能的值是0-255

当需要表示布尔值时,哪种数据types更好? 是tinyint值得额外的开销“以防万一”你需要值> 1?

当你添加一个位列到你的表时,它将占用每个logging中的整个字节,而不仅仅是一个位。 当你添加第二个比特列时,它将被存储在同一个字节中。 第九位列将需要第二个字节的存储。 具有1位列的表格将不会获得任何存储利益。

Tinyint和bit都可以工作,我已经成功地使用,没有强烈的偏好。

比特…除非你是“真/假/文件未find”的家族

如果你没有得到参考…

而在Linq2SQL的情况下,位与真/假工作,使编程更容易。 两者都有好处。

还有编程维护需要考虑。 如果你(或初级实习生程序员)使用2,3,25,41,167,200等等,会发生什么? 那里logging在哪里? 比特是自我logging和相当普遍。

我适当的时候使用位。 除了它在语义上是正确的types(语义计数!),单行(在SQL Server上)中的多位字段(最多8个)可以合并到单个字节的存储中。 在第八个之后,下一个8需要一个额外的字节,以此类推。

参考文献:

  • SQL 2000
  • SQL 2005
  • SQL 2008

对于MySql用户 – 为什么你不应该在MySQL中使用BIT列

以前的StackOverflow文章: MySQL中的BIT和TINYINT有什么区别?

当添加一个新的“BOOL”列时,MySQL实际上使用了TINYINT。

我只是坚持布尔 (又名TINYINT )并继续与生活。

我使用一点,因为它节省了我不得不使用检查约束,因为我的ORM会自动将位转换为可空的布尔值(C#),我非常感谢一旦编码。

所有这些理论上的讨论都很棒,但实际上,至less如果你使用的是MySQL,而且对于SQLServer也是如此,那么最好还是坚持使用非二进制数据来处理布尔值,原因很简单,当你重新输出数据,查询等。 如果您试图实现MySQL和SQLServer之间的互操作性(即您在两者之间同步数据),这一点尤其重要,因为BIT数据types的处理在两者中是不同的。 所以在实践中,如果你坚持使用数字数据types,你将会减less很多麻烦。 我会build议MySQL坚持布尔或BOOLEAN存储为TINYINT(1)。 即使MySQL Workbench和MySQL Administrator显示BIT数据types的方式也不好(这是二进制数据的一个小符号)。 所以要切实可行并且省去麻烦(不幸的是我是从经验中讲的)。

我只是尝试分组(SQL Server的2K5),它对我工作得很好。 我喜欢为应用程序使用正确的数据types。 如果这是一个真/假的领域,那么位是我使用…

布尔,根据定义,只允许两个值。 为什么你会需要更多的东西呢? 如果你需要三个(或更多)状态逻辑,那么使用一个更大的数据types,但是我会(并且确实)使用标准布尔逻辑的位域。

我不认为我看到了上面提到的,但是不能够聚合BIT列(例如MIN,MAX,特别是SUM)的问题。 我刚刚testing使用2008年,问题仍然存在。 这是我最近使用tinyint的最大原因 – 另一个是我喜欢tinyint的规模 – 当你的“双值”位标志突然需要更多的可能值时,总是很痛苦。

零空间为假

无论你select什么,你可以设置为NULL而不是0 ,它将不占用额外的空间 (因为数据库几乎每个行的每个字段都有一个NULL标志,就在这里 , 更多的信息在这里 )。 如果您还确保默认/最可能的值是false ,您将节省更多的空间!

一些真实的空间

要表示true值需要由字段types定义的空间; 如果一个表有多个这样的列,使用BIT将只节省空间,因为它每8个字段使用一个字节(而每个字段使用一个字节的TINYINT )。

TINYINT的优点是可以自定义一个8值位掩码而不用担心pipe理一堆额外的列,理论上search速度更快(单个整数字段与几个位字段)。 但是也有一些缺点,比如sorting比较慢,花式交叉索引,缺less字段名称。 对我而言,是最大的损失; 你的数据库将需要外部文件logging哪些位做了什么位掩码。

无论如何,避免使用TEXT字段来存储布尔值或布尔值的诱惑。 通过文本search对于服务器来说是更多的工作,并且诸如“打开,closures,closures”的任意命名scheme可能会损害互操作性。

我们使用int“vector”字段构build所有表。 然后,我们使用该字段作为32位的集合,我们可以为任何目的分配。 (对于一组状态,可能使用一组比特)。 如果我们忘记,避免我们不得不在旗帜领域join。

@Kevin:我相信你可以使用group bygroup by字段(SQL Server 2005):

 declare @t table ( descr varchar(10), myBit1 bit, myBit2 bit ) insert into @t values ('test1', 0, 1) insert into @t values ('test2', 1, 0) insert into @t values ('test3', 1, 1) insert into @t values ('test4', 0, 0) select myBit1, count(myBit1) from @t group by myBit1 select myBit2, count(myBit1) from @t group by myBit2 

结果:

 myBit1 ------ ----------- 0 2 1 2 myBit2 ------ ----------- 0 2 1 2 

如果您使用MySQL,那么不build议使用BIT数据types – http://www.xaprb.com/blog/2006/04/11/bit-values-in-mysql/

我喜欢用'T'或'F'来使用char(1)。 是的,它可以被其他值滥用,但至less很容易在报告或其他地方查看比特或二进制值更难处理。