我有2个表 ip
和 cidr
.
在第一个我存储IP的 . (2列表,id,ip),这是一个例子(值是虚构的):
id | ip
---+-------------
1 | 172.922.2.10
---+-------------
2 | 194.22.10.13
在第二个我存储CIDR网络掩码(2列表,id,cidr),这是一个例子(值是虚构的):
id | cidr
---+-------------
1 | 26.232.49.0/20
---+---------------
2 | 14.44.182.0/24
有没有办法做一个mysql查询来检查第一个表中的ip是否在我的任何cidr网络掩码的范围内?
注意:要将cidr网络掩码转换为ip的范围,请单击here
2 回答
我个人推荐使用postgres,因为它具有CIDR数据类型和强大的功能,但是在MySQL中做类似的事情也有一个有趣的讨论 .
http://planet.mysql.com/entry/?id=29283
这已经出现在我的一个相关项目中,这似乎是问题的最佳谷歌结果,所以,你得到答案!
然后你可以做...
from ip_map where INET_ATON("ip.add.re.ss") between get_lowest_ipv4(ip) AND get_highest_ipv4(ip)
因为您将函数声明为确定性函数,所以它将被缓存在mysql中,并且计算只需要运行一次 . 那么它只是'是大于y且小于x'的整数,这将是有效的瞬间 .
唯一重要的警告是您插入VALID CIDR . 例如,10.11.12.13/24无效 . 那是10.11.12.0/24网络中的IP地址 .
如果你在插入它们之前无法验证CIDR(出于某种疯狂的原因),你可以改变get_lowest_ipv4来对源进行逐位比较,但这不那么优雅 .
(未经测试)是否匹配无效的CIDR .