我需要以这样一种方式存储IPv6和IPv4地址,它们可以在SQL Server DB中或多或少使用CIDR符号进行排序和搜索。我打算使用二进制(16),将IPv4编码为IPv4映射的ipv6,因此任何一个IP地址都有一个单一的一致表示。我可以以二进制形式导出适当的网络掩码以提供给查询。但是SQL Server只能在一个操作数是数字时执行位操作。显然,我不能用二进制(16)和128位值做位'&'。
我意识到我可以读取每一行并在代码中执行此操作,但我需要在DB中进行此搜索,因为有数百万个ip要搜索。我看过大多数关于"存储"和二进制和文本之间转换的帖子。但这些并没有解决我的问题。我的问题更多的是关于二进制(16)的二进制搜索。
在SQL Server中影响二进制(16)字段的CIDR搜索的最佳方法是什么?
原来我没有正确地创建二进制范围来执行搜索。我使用。net IPAddress和BitArrayfor and/OR位操作。为了为网络部分创建适当的CIDR掩码,我必须在使用BitArray设置时反转每个字节的位顺序。原因是相对于每个字节,位位置以最低有效优先的方式存储。例如,当使用BitArray时,地址范围9的位位置(1-128)实际上是16。这实际上在API中有记录。现在我可以用预构建的网络掩码计算开始和结束范围,并在SQL between表达式中使用它们。