SQL Server:varbinary或int来存储位掩码?

时间:2009-04-30 22:17:04

标签: sql sql-server database-design bitmask

使用int vs varbinary在性能或灵活性方面存储位掩码是否有任何优势。

出于我的目的,我将一直在读取这些位掩码(没有写入或更新)。

4 个答案:

答案 0 :(得分:15)

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

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

如果确实需要更多标志并且必须使用BINARY,则会失去对按位运算符的本机支持,因此可以轻松支持检查标志值。我可能会将标志值检查移动到客户端应用程序,但如果您喜欢使用T-SQL编程,那么这也是一个选项。如果您正在使用C#,那么您有一个BitArray类,其中包含必要的操作,而在Java中,您有一个BitSet类。

答案 1 :(得分:6)

通常认为最好使用一堆位列而不是位掩码。它们将在页面中打包在一起,因此它们不会占用更多空间。虽然我似乎总是使用int或bigint列来避免所有列名称输入..但是使用intellisense我可能会使用位列。

答案 2 :(得分:2)

好吧,考虑到int的存储空间较少,通常更容易使用,我不知道你为什么要使用varbinary。

答案 3 :(得分:1)

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