在数据库中的IP地址比较

时间:2014-05-05 06:37:17

标签: php mysql

我正在尝试解决可以比较表中2列的问题。 表格如下

------------------------------------------
|  from    |    to           |  Country  |
------------------------------------------
| 25.0.0.1 | 25.255.255.255  |  denmark  |
------------------------------------------
| 68.0.0.1 | 68.255.255.255  |  USA      |

我的问题是我有一个25.195.32.0的IP,我希望将其与fromto列进行比较,然后返回country name

8 个答案:

答案 0 :(得分:11)

您可以使用INET_ATON获取要比较的IP的数值。

SELECT country FROM table
WHERE INET_ATON('25.195.32.0') BETWEEN INET_ATON(from) AND INET_ATON(to)

http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet-aton

答案 1 :(得分:1)

根据您使用IN()AND

,您可以找到OR尝试条件
WHERE from IN('your_ip') OR to IN('your_ip')

答案 2 :(得分:1)

将IP转换为整数,然后比较整数很简单。 MySQL提供了inet_aton功能。

select Country from table_name where inet_aton($ip) between inet_aton(`from`) and inet_aton(`ip`);

为了提高性能,您应该将列fromto转换为整数。例如。添加到列from_nto_n。然后你的SQL将是这样的:

select Country from table_name where inet_aton($ip) between `from_n` and `to_n`

如果您不使用MySQL,则应首先将$ip转换为整数$ ip_n(使用类似Python socket.inet_aton之类的内容),然后将inet_aton($ip)替换为{{1} }}

答案 3 :(得分:1)

select * from db.table

然后在php中(假设您运行了任务并存储了结果):

$lookupIP;

for($i=0;$i<$db->getRowCount();$i++) {
    $partsFROM = explode(".", $FROM);
    $partsTO = explode(".", $TO);
    $partsLOOKUP = explode(".",$lookupIP);
    if(
        $partsLOOKUP[0] >= $partsFROM[0] && $partsLOOKUP[0] <= $partsTO[0]  
     && $partsLOOKUP[1] >= $partsFROM[1] && $partsLOOKUP[1] <= $partsTO[1]  
     && etc..
    ) return $Country
}

不是特别高效或优雅,但你明白了。

答案 4 :(得分:1)

正如我从问题中解释的那样,您可以使用一些掩码并获取基本IP地址,然后进行比较。要使用掩码并获取基本ip,您需要了解有关使用寻址的不同类(A,B,C,D)的信息。

请参阅此链接http://www.subnet-calculator.com/

答案 5 :(得分:1)

INET_ATONIPV4地址提供了所需的解决方案。

除此之外,您还可以尝试HEX版本的IP进行比较。

SELECT  HEX( input_ip_value ) 
BETWEEN HEX( from_ip_column ) 
    AND HEX( to_ip_column )

示例

mysql> select @i:=hex('25.195.32.0'),
    -> @f:=hex('25.0.0.1'),
    -> @t:=hex('25.255.255.255'),
    -> @i between @f and @t is_between;
+------------------------+---------------------+------------------------------+------------+
| @i:=hex('25.195.32.0') | @f:=hex('25.0.0.1') | @t:=hex('25.255.255.255')    | is_between |
+------------------------+---------------------+------------------------------+------------+
| 32352E3139352E33322E30 | 32352E302E302E31    | 32352E3235352E3235352E323535 |          1 |
+------------------------+---------------------+------------------------------+------------+

答案 6 :(得分:1)

选择一个范围:

SELECT Country FROM table_name WHERE ip_address >= from AND to <= ip_address

如果你可以使用脚本(例如php),你可以选择整个表并为IP制作一个掩码。类似的东西:

  

我们可以知道什么属于网络地址192.168.129.3/18 ip as   如下:

ip_en_binario = decbin (ip2long ("192.168.129.3")); 
mascara_en_binario = decbin (ip2long ("255.255.192.0")); 
resultado_en_binario $ = $ & $ mascara_en_binario ip_en_binario; 
miss long2ip (bindec ($ resultado_en_binario)); 
     

结果返回我们这个脚本是192.168.128.0,这是IP所属的网络地址192.168.129.3/18。

然后,您可以使用“from”和“to”字段对网络进行“选择”。

答案 7 :(得分:0)

使用此查询

select Country from table_name where from=to;