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

ale*_*emb 11 sql sql-server database-design bitmask

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

出于我的目的,我将始终对这些位掩码进行读取(无写入或更新).

Ron*_*erg 15

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

此外,如果使用整数类型,则可以直接使用标准位运算符,而无需将字节数组转换为整数类型.

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


aha*_*ins 6

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

  • 我不同意,bitmasks仍然有他们的位置,他们是一个很好的方式让你的选项打开而不必重构你的数据库和SELECTS/VIEWS/SPROCS只是为了添加一个简单的bool,他们是非常灵活的...只是大多数程序员不明白这些天他们是什么 (7认同)
  • 程序员无知有时表明我们正在取得良好的进展,在引擎和框架内抽象低级优化.单个位域:1.由引擎有效处理(打包在一起,由本机代码而不是TSQL操纵).2.使用有意义的名称使您的查询更容易理解(而不是使用任意位索引号).3.可以在其上放置索引,从而加速查询.4.可以单独配置默认值.5.如果您决定字段需要两个以上的状态,则以后更容易重构为更大的类型.等等 (5认同)