我不想在这里引发一场宗教战争,但是在如何表示数据库中的布尔值方面似乎有两种思路。有人说bit
是合适的数据类型,而另一些人则认为tinyint
更好。
我知道的唯一区别是:
bit
:存储大小为1位,可能的值为0或1tinyint
:存储大小为1个字节,可能的值为0-255
当您需要表示布尔值时,哪种数据类型更好?是tinyint
值得的额外开销“以防万一”你需要值> 1?
我不想在这里引发一场宗教战争,但是在如何表示数据库中的布尔值方面似乎有两种思路。有人说bit
是合适的数据类型,而另一些人则认为tinyint
更好。
我知道的唯一区别是:
bit
:存储大小为1位,可能的值为0或1tinyint
:存储大小为1个字节,可能的值为0-255当您需要表示布尔值时,哪种数据类型更好?是tinyint
值得的额外开销“以防万一”你需要值> 1?
Answers:
位...除非您属于“ true / false / file not found”氏族
在Linq2SQL的情况下,bit与true / false一起使用可简化编程。两者都有优势。
并且还需要考虑编程维护。如果您(或初级实习生程序员)使用2、3、25、41、167、200等会怎样?在哪里记录?比特是自我记录的,非常通用。
对于MySql用户-为什么不应该在MySQL中使用BIT列
之前的StackOverflow帖子: MySQL中的BIT和TINYINT有什么区别?
当添加新的“ BOOL”列时,MySQL实际上使用TINYINT。
我只是坚持使用BOOL(aka TINYINT)并继续生活。
零空间错误
无论您选择什么,都可以设置为,NULL
而0
不会占用任何额外的空间(因为数据库几乎总是NULL
每行的每个字段都有一个标志,只坐在那里;更多信息在此处)。如果您还确保默认/最可能的值为false
,则可以节省更多空间!
真正的空间
表示的值true
需要由字段类型定义的空间;BIT
如果表有多个这样的列,则using仅会节省空间,因为它每8个字段TINYINT
使用一个字节(而每个字段使用一个字节)。
TINYINT
具有允许您自定义8值位掩码的优点而不必担心管理一堆额外的列,并且从理论上讲搜索速度更快(单个整数字段与几个位字段)。但是存在一些缺点,例如排序速度较慢,花哨的交叉索引内容以及缺少字段名称。对我来说,最大的损失是什么?您的数据库将需要外部文档来记录哪些位在哪些位掩码中做了什么。
无论如何,请避免使用TEXT
字段存储布尔值或布尔值集的诱惑。对于服务器来说,搜索文本将花费更多的精力,诸如“ on,off,off”之类的任意命名方案可能会损害互操作性。
所有这些理论上的讨论都很棒,但实际上,至少在您同时使用MySQL和SQL Server的情况下,最好为布尔值坚持使用非二进制数据,原因很简单,因为当您使用布尔值时更容易使用正在输出数据,查询等等。如果要实现MySQL和SQLServer之间的互操作性(即在两者之间同步数据),则尤其重要,因为BIT数据类型的处理在两者中是不同的。所以在实践中,如果坚持使用数字数据类型,那么麻烦就少得多。我建议MySQL坚持使用BOOL或BOOLEAN,它们将存储为TINYINT(1)。甚至MySQL Workbench和MySQL Administrator显示BIT数据类型的方式也不是很好(二进制数据有点符号)。
我认为我没有看到上面提到的问题,但是存在无法汇总BIT列(例如MIN,MAX,尤其是SUM)的问题。我刚刚使用2008进行了测试,但问题仍然存在。这是我最近使用tinyint的最大原因-另一个是我喜欢tinyint的缩放方式-当您的“两个值”位标志突然需要更多可能的值时,总是很痛苦。
我们使用int“向量”字段构建所有表。然后,我们将该字段用作32位的集合,可以将其分配给任何目的。(可能将一组位用于一组状态)。如果我们忘记了,可以避免我们不得不继续添加标志字段。
@Kevin:我相信您可以group 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,则不建议使用BIT数据类型-http: //www.xaprb.com/blog/2006/04/11/bit-values-in-mysql/
我喜欢将char(1)与'T'或'F'一起使用。是的,它可以与其他值一起使用,但至少可以在报表或其他较难使用位或二进制值的地方轻松查看。
-1
用来表示true和0
false。