我有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 |
+---------------+------------+
答案 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')
答案 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.13
和15
一样,在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')