Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:varbinary或int来存储位掩码?_Sql_Sql Server_Database Design_Bitmask - Fatal编程技术网

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

SQL Server:varbinary或int来存储位掩码?,sql,sql-server,database-design,bitmask,Sql,Sql Server,Database Design,Bitmask,在性能或灵活性方面,使用int vs varbinary存储位掩码是否有任何优势 出于我的目的,我将始终在这些位掩码上执行读取操作(无写入或更新)。好吧,考虑到int的存储空间较少,并且通常更易于使用,我不确定为什么要使用varbinary。您肯定应该使用int(如果需要32个标志)或BIGINT(对于64个标志)。如果您需要更多可以使用的标志(但您也应该问问自己,为什么在应用程序中需要这么多标志) 此外,如果使用整数类型,则可以直接使用standard,而无需将字节数组转换为整数类型 如果您确

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


出于我的目的,我将始终在这些位掩码上执行读取操作(无写入或更新)。

好吧,考虑到int的存储空间较少,并且通常更易于使用,我不确定为什么要使用varbinary。

您肯定应该使用
int
(如果需要32个标志)或
BIGINT
(对于64个标志)。如果您需要更多可以使用的标志(但您也应该问问自己,为什么在应用程序中需要这么多标志)

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


如果您确实需要更多标志,并且必须使用
二进制
,那么您将失去对位运算符的本机支持,从而无法轻松检查标志值。我可能会将标记值的检查转移到客户端应用程序,但如果您对使用T-SQL编程感到满意,那么这也是一个选项。如果您使用的是C#,那么您有一个包含必要操作的类,而在Java中您有一个类。

通常认为最好使用一组位列而不是位掩码。他们会在书页里挤在一起,所以他们不会占用更多的空间。虽然我似乎也总是使用int或bigint列来避免所有的列名键入。。但对于intellisense,我可能会使用位列。

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

是的,还是使用较小的类型,如用于较小位掩码的tiny int?我从来没有使用过一个小整数作为位掩码,但应该没有问题。int的工作很好。例如,当我们有100个标志时,如何使用varbinary?varbinary可以像int或bigint一样灵活使用吗?不可能对两个varbinary进行位运算。我们如何模拟int标志行为呢?我会使用
二进制(13)
来实现这一点(可以容纳104位/标志)。但是,您失去了对按位运算符的本机支持。我更新了我的答案,提供了一些选项。我不同意,位掩码仍然有它们的位置,它们是一个很好的方法,可以让您的选项保持打开状态,而无需重构数据库和选择/VIEWS/SPROCS只需添加一个简单的bool,它们非常灵活。。。只是大多数程序员不明白他们这些天在做什么。程序员的无知有时表明我们在引擎和框架中抽象出低级优化方面取得了很大的进步。单个位字段:1。由引擎有效地处理(打包在一起,由本机代码而不是TSQL操纵)。2.具有有意义的名称,使您的查询更容易理解(而不是使用任意位索引号)。3.可以在其上放置索引,从而加快查询速度。4.可以有单独可配置的默认值。5.如果您确定字段需要两个以上的状态,则以后更容易重构为更大的类型。等等。SQL中的位掩码只会扼杀SQL的功能—您永远无法高效地查询它们。因此,不应使用它们。至少有一种情况需要位掩码字段:索引限制为16列,如果使用一组标志或一系列压缩值,则可能会超过16列。@JonofAllTrades该限制仅适用于构成索引键的列(您可以将位添加为包含列并仍然对其进行谓词)。您是否经历过索引键中包含16个以上布尔值的情况?除了…逐位运算符强制进行表扫描,这会降低性能,同时可以高效地查询单个位字段。