Java 如何在cidr符号中搜索ip地址
我需要在mysql数据库中搜索以下IP地址为“192.168.0.1/20”的条目 注意:存储的ip地址是varchar(例如192.168.0.3192.168.0.4) 我的解决方案是从给定的cidr符号中查找网络地址(用“*”)并在数据库中搜索192.168.*.条目,因为它们存储在字符串中。这是可行的,但我不确定这是否正确 有谁能指出问题所在或比这更好的解决方案吗?如果每个VARCHAR字段只有一个IP地址,那么下面的方法很有效 使用网络掩码将IP地址与其网络匹配的正确方法是通过/ 不过,有几个步骤。首先使用以下命令将长度转换为子网掩码:Java 如何在cidr符号中搜索ip地址,java,mysql,network-programming,ip-address,cidr,Java,Mysql,Network Programming,Ip Address,Cidr,我需要在mysql数据库中搜索以下IP地址为“192.168.0.1/20”的条目 注意:存储的ip地址是varchar(例如192.168.0.3192.168.0.4) 我的解决方案是从给定的cidr符号中查找网络地址(用“*”)并在数据库中搜索192.168.*.条目,因为它们存储在字符串中。这是可行的,但我不确定这是否正确 有谁能指出问题所在或比这更好的解决方案吗?如果每个VARCHAR字段只有一个IP地址,那么下面的方法很有效 使用网络掩码将IP地址与其网络匹配的正确方法是通过/ 不过
SET @l=20;
SELECT INET_NTOA(0xffffffff >> (32-@l) << (32-@l));
当然,您可以将其合并为一条语句,如:
SELECT * FROM yourtable
WHERE (INET_ATON(addrfield) & (0xffffffff >> (32-@l) << (32-@l))) = INET_ATON('192.168.0.0');
从表格中选择*
WHERE(INET_ATON(addrfield)和(0xffffffff>>(32-@l)您的192.168.*解决方案将不起作用,因为192.168.0.1/20的最大主机地址为192.168.15.254,但您的数据库中可以有192.168.16.1、192.168.16.2等地址。谢谢stanislav(面部手掌移动)就我而言,目前我只看到两种解决方案:获取所有地址并在子句中使用,或者取一个最小主机和最大主机,将它们分成4个组,如果每个组不相同,则为每个组创建一个regexp,然后将4个regexp组用点拆分在一起,并尝试使用regexp调用查询。但这可能会导致非最优选择…这又如何“从INET_ATON(ip_address
)>{STARTING_ip_address}&&INET_ATON(ip_address
)<{eading_ip_address};()看起来不错的地址中选择*,我对MySQL不是很熟悉,主要是对Oracle或PG,我不知道MySQL有这样的功能。但是你不需要做INET_ATON({STARTING_ip_address})你能检查一下我最后的评论“从地址中选择*,其中INET\u-ATON(ip\u-address)>{STARTING\u-ip\u-address}&&INET\u-ATON(ip\u-address)<{EDING\u-ip\u-address}”这还不够吗?@rockyit86,是的,如果您有第一个和最后一个地址,即所述子网的网络和广播地址,那么这就行了。LPAD()
和RPAD()的有趣用法
构建一个掩码@vhu。生成掩码的替代方法包括0xffffffff>@l>32&~0@Michael sqlbot,他同意这是更好的方法。如果我做了减法,d'oh。(32-@l)
确实如此。+1
SELECT 0xffffffff >> (32-@l) << (32-@l) INTO @mask;
SET @l=20;
SET @nw='192.168.0.0';
SELECT 0xffffffff >> (32-@l) << (32-@l) INTO @mask;
SELECT * FROM yourtable
WHERE (INET_ATON(addrfield) & @mask) = INET_ATON(@nw);
SELECT * FROM yourtable
WHERE (INET_ATON(addrfield) & (0xffffffff >> (32-@l) << (32-@l))) = INET_ATON('192.168.0.0');