Sql 锡和比特?

Sql 锡和比特?,sql,mysql,sql-server,types,Sql,Mysql,Sql Server,Types,我不想在这里引发一场宗教战争,但在如何在数据库中表示布尔值方面,似乎有两种观点。一些人认为bit是合适的数据类型,而另一些人则认为tinyint更好 我所知道的唯一区别是: 位:存储大小为1位,可能的值为0或1 tinyint:存储大小为1字节,可能的值为0-255 当需要表示布尔值时,哪种数据类型更好?tinyint是否值得额外的开销“以防万一”您需要值>1?位…除非您属于“真/假/未找到文件”族 在Linq2SQL的情况下,bit与true/false一起工作,这使得编程更容易。两者都

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

我所知道的唯一区别是:

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

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

位…除非您属于“真/假/未找到文件”族

在Linq2SQL的情况下,bit与true/false一起工作,这使得编程更容易。两者都有好处


还有编程维护要考虑。如果您(或初级实习程序员)使用2、3、25、41、167、200等,会发生什么?记录在哪里位是自记录的,非常通用。

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

我刚刚尝试在位(SQL Server 2k5)上分组,它对我来说很好。我喜欢为应用程序使用正确的数据类型。如果它是真/假字段,那么bit就是我使用的

我们用int“vector”字段构建所有表。然后,我们将该字段用作32位的集合,我们可以为任何目的分配这些位。(可能对一组状态使用一组位)。避免我们在忘记的情况下继续添加标志字段。

我相信您可以在位字段上使用
分组方式(SQL Server 2005):

结果:

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

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

以前的StackOverflow post:

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


我会坚持使用BOOL(又名TINYINT)继续生活。

对于MySql用户-

如果您使用的是MySql,那么不建议使用位数据类型-

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

参考资料:


当您向表中添加位列时,它将在每条记录中占用整个字节,而不仅仅是一个位。当您添加第二个位列时,它将存储在同一字节中。第九位列需要第二个字节的存储。列为1位的表不会获得任何存储好处


Tinyint和bit都可以使用,我已经成功地使用了它们,并且没有强烈的偏好。

我喜欢使用带有“T”或“F”的char(1)。是的,它可以被其他值滥用,但至少它很容易在报告或其他更难使用位或二进制值的地方查看。

我使用位是因为它省去了我使用检查约束的麻烦,而且因为我的ORM会自动将位转换为可为空的布尔值(C#),我非常感谢曾经的编码。

所有这些理论上的讨论都很好,但实际上,至少如果您使用的是MySQL,也确实是SQLServer,那么最好坚持使用布尔值的非二进制数据,原因很简单,当您输出数据、查询等时更容易处理。如果您试图实现MySQL和SQLServer之间的互操作性(即,在两者之间同步数据),这一点尤其重要,因为在这两个数据库中对位数据类型的处理是不同的。因此,在实践中,如果坚持使用数字数据类型,麻烦会少很多。我建议MySQL使用BOOL或BOOLEAN,它们存储为TINYINT(1)。甚至MySQL Workbench和MySQL Administrator显示位数据类型的方式也不好(它是二进制数据的一个小符号)。所以要实际一点,省去麻烦(不幸的是,我是根据经验说的)。

我想我没有看到上面提到的,但存在无法聚合位列(例如,MIN、MAX,尤其是SUM)的问题。我刚刚使用2008进行了测试,问题仍然存在。这是我最近使用tinyint的最大原因——另一个原因是我喜欢tinyint的缩放方式——当“二值”位标志突然需要更多可能的值时,总是很痛苦。

零空间表示False

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

为True留出一些空间

表示
true
的值需要字段类型定义的空格;使用
BIT
仅当一个表有多个这样的列时才会节省空间,因为它每8个字段使用一个字节(而
TINYINT
每个字段使用一个字节)

TINYINT
的优点是允许您自定义一个8值,而不必担心管理一堆额外的列,而且理论上搜索速度更快(一个整数字段比几个位字段)。但也有一些缺点,如排序较慢、花哨的交叉索引以及缺少字段名。对我来说,这是最大的损失;您的数据库需要外部文档来记录哪些位在哪些位掩码中做了什么

在任何情况下,都要避免使用
TEXT
字段来存储布尔值或布尔值集。搜索t
myBit1 
------ -----------
0      2
1      2

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