Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在cidr符号中搜索ip地址_Java_Mysql_Network Programming_Ip Address_Cidr - Fatal编程技术网

Java 如何在cidr符号中搜索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地址与其网络匹配的正确方法是通过/ 不过

我需要在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');