T-Sql:检查IP是否与网络掩码匹配

时间:2009-12-30 15:03:40

标签: tsql ip-address bit-manipulation netmask

我的SQL-Server数据库将IP网络掩码存储为二进制文件。 我需要一种方法来匹配这些与给定的IP

例如, 是192.168.21.5网络掩码的一部分,它存储在DB?

192.168.21.5的二进制表示形式:

11000000.10101000.00010101.00000101 (without the dots)

存储在DB中的网络掩码是:binary(4)和tinyint字段:

11000000.10101000.00010101.00000000 / 24

(这将是:192.168.21.0 /24)所以,192.168.21.5的前24位必须匹配数据库中的记录。

我如何只检查二进制字段的第一个n位(类似于LEFT(text, 24))?

有没有聪明的方法可以做到这一点,可能是按位AND

4 个答案:

答案 0 :(得分:7)

declare @address binary(4) -- goal is to check if this address
declare @network binary(4) -- is in this network
declare @netmask tinyint   -- with this netmask in /NN format

set @address = 0xC0A81505 -- 192.168.21.5
set @network = 0xC0A81500 -- 192.168.21.0
set @netmask = 24

select
  'address matches network/netmask'
where
  0 = (
      cast(@address as int) ^ cast(@network as int))
      &
      ~(power(2, 32 - @netmask) - 1)
      )

@netmask必须介于2到32之间。

答案 1 :(得分:1)

192.168.21.5 XOR netmask (192.168.21.0) AND 255.255.255.0(您只需要前24位)应该是“匹配”IP上的所有0

答案 2 :(得分:0)

这个条件是这样的:

(0xffffffff - POWER(2, 32 - bits) + 1) & CAST(ip AS int) = CAST(netmask AS int)

答案 3 :(得分:0)

如果你想使用掩码0或1位,那么你需要更改电源(2,32 - @netmask) power(cast(2 as bigint),32 - @netmask) 再见