我有一个以IP地址(ipNumeric)存储为无符号整数的表A,还有一个具有子网(subnetNumeric)的表B:

INET_NTOA(ipNumeric) = 192.168.0.1
INET_NTOA(subnetNumeric) = 192.168.0.0

我想检查这个 IP 是否是子网的成员。

子网是 A 类、B 类和 C 类。

这是否可以在 MySQL 中在合理的时间内动态完成,还是应该预先计算子网范围?

最佳答案

当然,这是可行的。这个想法是我们通过将最高有效位设置为 1 来计算子网掩码,其数量与子网类别所规定的一样多。对于 C 类,那将是

SELECT -1 << 8;

然后,将子网掩码与您拥有的IP地址进行“与”操作;如果IP位于子网内,则结果应等于子网地址-标准联网内容。因此,我们最终得到:
SELECT (-1 << 8) & INET_ATON("192.168.0.1") = INET_ATON("192.168.0.0");

更新:是,有必要知道网络类别或子网掩码(等效信息)。如果您没有此信息,请考虑如何处理子网为X.Y.0.0的情况。这是 X.Y.0.0/16 还是 X.Y.0.0/8 其中第三个八位字节恰好是 0?没办法知道。

如果您知道子网掩码,则查询可以写为
SELECT (-1 << (33 - INSTR(BIN(INET_ATON("255.255.255.0")), "0"))) &
       INET_ATON("192.168.0.1") = INET_ATON("192.168.0.0");

关于mysql - 检查IP是否在子网中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10001933/

10-11 01:42
查看更多