使用int vs varbinary在性能或灵活性方面存储位掩码是否有任何优势。
出于我的目的,我将一直在读取这些位掩码(没有写入或更新)。
答案 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的按位运算符(&,|等等),可以很容易地找出是否设置了一系列标志。使用相等运算符对大量位字段做更多的工作。