基于IPv4和IPv6范围

时间:2017-07-11 20:34:03

标签: sql sql-server-2008 ip range ip-address

首先,对不起,如果已经问过这个问题,但我到处搜索过(包括这个网站),并且发现了一些类似的情况,但没有与IPv6有关的解决方案。我试图在IPv4地址上实现的解决方案非常慢。 我想基于表B中的IPAddress在表A中的range_from和range_to之间加入2个表。 这是在SQL Server 2008上:

我有2张桌子, 表A包含:

  1. range_from(varchar)
  2. range_to(varchar)
  3. country(varchar)
  4. 表B包含

    1. IPAddress(varchar)
    2. 真正重要的唯一字段是IPAddress
    3. 所以我需要将表A和表B连接在一起

      ON b.IPAddress BETWEEN a.range_from AND a.range_to
      

      这是我的JOIN条款。对于包含IP地址的3个字段,我创建了一个函数,将人类可读的地址转换为BIGINT,以便正确搜索范围:

      create function [dbo].[IPAddressToInteger](@ip as varchar(15))
      returns bigint
      as
      begin
      return (
      convert(bigint, parsename(@ip, 1)) +
      convert(bigint, parsename(@ip, 2)) * 256 +
      convert(bigint, parsename(@ip, 3)) * 65536 +
      convert(bigint, parsename(@ip, 4)) * 16777216
      )
      end
      

      我的解决方案效率不高,不包含IPv6地址。我不经常使用SQL,并且对SQL不包含任何IPAddress数据类型感到惊讶。

      此方案中的最佳做法是什么?

0 个答案:

没有答案