【发布时间】:2016-01-07 08:41:16
【问题描述】:
我需要在mysql数据库中搜索以下ip地址“192.168.0.1/20”的条目
注意:存储的 ip 地址是 varchars(例如 192.168.0.3,192.168.0.4)
Address: 192.168.0.1 11000000.10101000.0000 0000.00000001
Netmask: 255.255.240.0 = 20 11111111.11111111.1111 0000.00000000
Wildcard: 0.0.15.255 00000000.00000000.0000 1111.11111111
=>
Network: 192.168.0.0/20 11000000.10101000.0000 0000.00000000
HostMin: 192.168.0.1 11000000.10101000.0000 0000.00000001
HostMax: 192.168.15.254 11000000.10101000.0000 1111.11111110
Broadcast: 192.168.15.255 11000000.10101000.0000 1111.11111111
Hosts/Net: 4094 Class C, Private Internet
我的解决方案是从给定的 cidr 表示法中找到网络地址(将 0 替换为“*”)并在数据库中搜索 192.168.*.* 条目,因为它们存储在字符串中。它有效,但我不确定这是否正确
谁能指出问题或比这更优化的解决方案?
【问题讨论】:
-
您使用 192.168.*.* 的解决方案将不起作用,因为 192.168.0.1/20 的最大主机地址为 192.168.15.254,但您的数据库中可能有地址,例如 192.168.16.1、192.168.16.2等。
-
谢谢 stanislav(掌心移动)
-
就我而言,我目前只看到 2 个解决方案:获取所有地址并使用 IN 子句,或者获取最小和最大主机,将它们分成 4 个组,为每个组创建一个正则表达式如果它们不相同,则将 4 个正则表达式组与点一起拆分并尝试使用正则表达式调用查询。但它可能导致不是最佳选择...
-
这个“SELECT * from address where INET_ATON(
ip_address) > {STARTING_IP_ADDRESS} && INET_ATON(ip_address) ultratools.com/tools/netMaskResult?ipAddress=192.168.0.1%2F20+) -
好像不错,我对MySQL不是很熟悉,主要是Oracle或者PG,不知道MySQL有这样的功能。但是您是否也不需要制作 INET_ATON({STARTING_IP_ADDRESS}) 并使其也等于?
标签: java mysql network-programming ip-address cidr