如何使用查询在数据库的ip范围之间选择ip地址?

时间:2018-02-06 10:12:31

标签: mysql sql

我有ip_table如下。假设我的IP address is 1.22.13.15。但是在我的表中,这个确切的IP地址不可用,该IP地址在0/24之间。如何获取此IP地址的geoname_id?有人可以帮我吗?或者还有其他方式吗?

+---------------+------------+
| ip_adr        | geoname_id |
+---------------+------------+
| 1.22.13.0/24  |    1279233 |
| 1.22.130.0/23 |    1273294 |
| 1.22.132.0/23 |    1267995 |
| 1.22.134.0/23 |    1253405 |
| 1.22.136.0/21 |    1269750 |
+---------------+------------+

6 个答案:

答案 0 :(得分:1)

您可以使用RegEx中的SQL来识别IP格式,并检查所选IP是否在您提供的范围内。

示例:

SELECT *
FROM ips
WHERE (ip_addr REGEXP '^[0-9]{1}\.[0-9]{2}\.[0-9]{2,3}\.0\/(24)')

答案 1 :(得分:1)

据我所知,没有MySQL函数可以直接处理IP地址的范围语法。 但MySQL有一个函数来转换一个bigint数字的IP地址:INET_ATON()

一种可能的解决方案是以可以使用简单查询的方式扩展表结构:

|ip_adr_range_start  |ip_adr_range_end | geoname_id|
|[bigint]            |[bigint]         | [int?]

第一行将按如下方式插入:

INSERT INTO your_table VALUES (INET_ATON('1.22.13.0'), INET_ATON('1.22.13.255'), 1279233);

查询可以是:

SELECT * from your_table 
WHERE ip_adr_range_start < INET_ATON('1.22.13.15') 
AND ip_adr_range_end > INET_ATON('1.22.13.15')

从这里获取的想法: https://dba.stackexchange.com/questions/36451/convert-the-ip-address-range-to-two-bigint-for-faster-lookup

答案 2 :(得分:1)

尝试Substring_index

select left('1.22.13.0/24',length('1.22.13.0/24')- length(substring_index('1.22.13.0/24','.',-1))) part1,substring_index(substring_index('1.22.13.0/24','.',-1),'/',1) as range_start,substring_index('1.22.13.0/24','/',-1) range_end

输出将是

part1 | range_start| range_end

1.22.13.| 0 | 24

然后你可以相应地比较你的价值

答案 3 :(得分:0)

我猜这个表意味着在1.22.13.0-1.22.13.255之间的ip范围将与1279233 geonameid匹配。 您需要按提供的子网定义IP范围。 那么,要获得具有特定IP的geonameid,请问它的IP和子网是什么? 如何比较具体的IP地址与IP范围,并与geonameid进行比较?有关详情,请访问How to check an IP address is within a range of two IPs in PHP?

答案 4 :(得分:0)

我使用以下查询获得输出。

我将IP地址拆分为两部分。与1.22.1315一样,在where条件下传递了这些内容。

SELECT ip_adr, geoname_id
FROM ip_table 
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(ip_adr, '/', 1 ), '.', 3) = 
'1.22.13' AND
SUBSTRING_INDEX(SUBSTRING_INDEX(ip_adr, '/', 1 ), '.', -1) <= '15';

答案 5 :(得分:0)

with ipaddressTBL as(
    select *,  INET_ATON(ip) as ipaddress from `routers` 
) select * from ipaddressTBL 
where ipaddress BETWEEN INET_ATON('32.248.135.197') AND INET_ATON('165.9.105.127')