使用mysql查询从IP地址和掩码计算子网

时间:2016-02-11 15:44:41

标签: mysql

如果我有一个使用mysql的ip地址和掩码,是否可以计算子网。我知道在php中这样做,在mysql中寻找一种方法。我不是在寻找cidr

My example data

ip address: 10.196.73.249
mask:29

1 个答案:

答案 0 :(得分:3)

如果您已经知道如何在PHP中执行此操作,那么数学运算对您来说不应该是一个惊喜,只需要IP地址和子网掩码。

使用MySQL的INET_ATON()函数将IP地址转换为数字;这相当于PHP的ip2long()函数。要创建掩码,请使用REPEAT()函数放置必需数量的掩码,并使用零填充字符串的其余部分。 CONV()将二进制字符串更改为十进制,以便我们可以进行数学计算,然后使用最终INET_NTOA()将其返回到IP地址格式。

SET @IP='10.196.73.249';
SET @CIDR='29';
SELECT INET_NTOA(
    INET_ATON(@IP) &
    CONV(CONCAT(REPEAT(1, @CIDR), REPEAT(0, 32 - @CIDR)), 2, 10)
) AS network;

以下是如何实现存储程序:

CREATE FUNCTION get_network (ipadd VARCHAR(15), mask VARCHAR(2)) RETURNS VARCHAR(15)
RETURN INET_NTOA(
    INET_ATON(ipadd) &
    CONV(CONCAT(REPEAT(1, mask), REPEAT(0, 32 - mask)), 2, 10)
);

这可以像这样调用:

root@localhost [test]> SELECT get_network("192.168.242.234", "20");
+--------------------------------------+
| get_network("192.168.242.234", "20") |
+--------------------------------------+
| 192.168.240.0                        |
+--------------------------------------+
1 row in set (0.00 sec)