【问题标题】:How can I do a CIDR query on SQL Server Binary Column Type如何对 SQL Server 二进制列类型进行 CIDR 查询
【发布时间】:2014-08-19 19:24:47
【问题描述】:

我需要同时存储 IPv6 和 IPv4 地址,以便它们可以或多或少地使用 CIDR 表示法在 SQL Server DB 中进行排序和搜索。我打算使用二进制(16),将 IPv4 编码为 IPv4-mapped-IPv6,因此任何一个 IP 地址都有一个一致的表示。我可以以二进制形式导出适当的网络掩码以提供给查询。但是 SQL Server 只能在一个操作数是数字时执行按位运算。我显然不能对二进制(16)和 128 位值进行按位“&”。

我意识到我可以读取每一行并在代码中执行此操作,但我需要在数据库中进行此搜索,因为要搜索几百万个 IP。我看过大多数关于“存储”和在二进制和文本之间转换的帖子。但那些并没有解决我的问题。我的问题更多是关于 binary(16) 的二进制搜索。

在 SQL Server 中对二进制 (16) 字段进行 CIDR 搜索的最佳方法是什么?

【问题讨论】:

    标签: sql-server-2012 ip-address bitwise-operators binary-data cidr


    【解决方案1】:

    原来我没有正确创建二进制范围来执行搜索。我正在使用 .NET IPAddress 和 BitArray 进行 AND/OR 位运算。为了为网络部分创建正确的 CIDR 掩码,在使用 BitArray 设置每个字节时,我必须颠倒每个字节的位顺序。原因是位位置相对于每个字节存储为最低有效优先。因此,例如,当使用 BitArray 时,地址范围的 9 的按位位置 (1-128) 实际上是 16。这实际上记录在 API 中。现在,我可以使用预构建的网络掩码计算开始和结束范围,并在 SQL 之间的表达式中使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 2016-04-20
      相关资源
      最近更新 更多