【发布时间】:2009-04-30 22:17:03
【问题描述】:
就性能或灵活性而言,使用 int 与 varbinary 存储位掩码有什么优势吗?
出于我的目的,我将始终对这些位掩码进行读取(不写入或更新)。
【问题讨论】:
标签: sql sql-server database-design bitmask
就性能或灵活性而言,使用 int 与 varbinary 存储位掩码有什么优势吗?
出于我的目的,我将始终对这些位掩码进行读取(不写入或更新)。
【问题讨论】:
标签: sql sql-server database-design bitmask
您绝对应该使用INT(如果您需要 32 个标志)或BIGINT(对于 64 个标志)。如果您需要更多标志,可以使用BINARY(但您可能还应该问自己,为什么您的应用程序中需要这么多标志)。
另外,如果使用整型,可以直接使用标准的bitwise operators,无需将字节数组转为整型。
如果您确实需要更多标志并且必须使用BINARY,您将失去对位运算符的原生支持,因此无法轻松支持检查标志值。我可能会将检查标志值转移到客户端应用程序,但如果您习惯使用 T-SQL 编程,这也是一个选项。如果您使用 C#,则您有一个 BitArray 类,其中包含必要的操作,而在 Java 中,您有一个 BitSet 类。
【讨论】:
BINARY(13)(有 104 位/标志的空间)。但是,您失去了对位运算符的本机支持。我更新了我的答案以提供一些选项。
通常认为最好使用一组位列而不是位掩码。它们将在页面中打包在一起,因此它们不会占用更多空间。虽然我似乎也总是使用 int 或 bigint 列来避免输入所有列名。但使用智能感知我可能会使用位列。
【讨论】:
好吧,考虑到 int 的存储空间较小,并且通常使用起来更容易一些,我不确定您为什么要使用 varbinary。
【讨论】:
我通常同意@hainstech 使用位字段的回答,因为您可以明确命名每个位字段以指示它应该存储的内容。但是,我还没有看到与位字段进行位掩码比较的实用方法。使用 SQL Server 的按位运算符(&、| 等),很容易找出是否设置了一系列标志。使用等式运算符针对大量位字段进行更多工作。
【讨论】: