如果我有一个使用mysql的ip地址和掩码,是否可以计算子网。我知道在php中这样做,在mysql中寻找一种方法。我不是在寻找cidr
My example data
ip address: 10.196.73.249
mask:29
答案 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)