检查IP是否在子网中

mat*_*asf 6 mysql ip subnet

我有一个表A,其中IP地址(ipNumeric)存储为无符号整数,表B包含子网(subnetNumeric):

INET_NTOA(ipNumeric) = 192.168.0.1
INET_NTOA(subnetNumeric) = 192.168.0.0
Run Code Online (Sandbox Code Playgroud)

我想检查一下这个IP是否是子网的成员.

子网是A,B和C类.

这是否可以在MySQL中的合理时间内进行,或者子网范围是否应该预先计算?

Jon*_*Jon 13

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

SELECT -1 << 8;
Run Code Online (Sandbox Code Playgroud)

然后,用你拥有的IP地址和子网掩码; 如果IP在子网内,结果应该等于子网地址 - 标准网络内容.所以我们最终得到:

SELECT (-1 << 8) & INET_ATON("192.168.0.1") = INET_ATON("192.168.0.0");
Run Code Online (Sandbox Code Playgroud)

更新:是的,有必要知道网络类子网掩码(这是等效信息).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");
Run Code Online (Sandbox Code Playgroud)