2009-04-30 37 views

回答

15

您应该使用INT(如果您需要32个标记)或BIGINT(对于64个标记)。如果你需要更多的标志,你可以使用BINARY(但你也应该问自己为什么你的应用需要这么多标志)。

此外,如果您使用整数类型,则可以直接使用标准bitwise operators,而无需将字节数组转换为整数类型。

如果您确实需要更多标志并且必须使用BINARY,您将失去对按位运算符的本地支持,因此很容易支持检查标志值。我可能会将检查标志值检查到客户端应用程序,但是如果您对T-SQL的编程感到满意,那也是一种选择。如果你使用的是C#,你有一个BitArray类的必要的操作,在Java中你有一个BitSet类。

+1

是的,还是事件小的类型像tiny int为较小的位掩码?我从来没有使用过微小的int作为位掩码,但应该没有问题。 int的工作很棒。 – 2009-04-30 23:10:35

+1

较小的面罩类型也是一个好主意。 – 2009-05-02 08:23:50

+0

我们如何使用varbinary,例如100个标志? varbinary可以像int或bigint那样灵活使用吗?对两个varbinary进行按位运算是不可能的。我们如何模仿int-flag行为? – aldebaran 2013-12-17 11:22:51

2

嗯,考虑到int具有更少的存储空间,并且通常更容易处理我不确定为什么要使用varbinary。

6

通常认为使用一堆位列而不是位掩码更好。他们会一起打包在页面中,所以他们不会再占用更多空间。尽管我似乎总是使用int或bigint列来避免所有的列名输入......但是对于intellisense,我可能会使用位列。

1

我通常同意@ hainstech使用位域的答案,因为你可以明确地命名每个位域来表明它应该存储什么。但是我还没有看到用位域做位掩码比较的实用方法。使用SQL Server的按位运算符(&,|等...)很容易找出是否设置了一系列标志。对于大量的位域,等式运算符要做更多的工作。