首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查MYSQL中的IP是否在某个范围内

问检查MYSQL中的IP是否在某个范围内
EN

Stack Overflow用户
提问于 2018-03-20 17:00:04
回答 1查看 2.6K关注 0票数 2

我有一个简单的表,其中有这样的IP范围(它们被保存为varchar,但如果需要的话,我可以更改):

代码语言:javascript
复制
1.0.0.0/24
1.0.1.0/24
1.0.2.0/23
1.0.4.0/22
...etc

如何选择给出的IP地址属于该范围的行?

类似于:

代码语言:javascript
复制
SELECT range FROM ipranges WHERE '195.124.199.201' IN range

编辑:建议的重复答案MySQL检查IP地址是否在范围内?不适用于我,因为它假定范围指定为两个IP地址,但我的表示法使用斜杠,我不知道如何在两者之间进行转换。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-20 17:26:24

您需要使用阿顿()将IPv4地址格式转换为等效的无符号整数。

首先,根据CIDR符号计算起始地址和结束地址。

代码语言:javascript
复制
mysql> SELECT INET_ATON(SUBSTRING_INDEX(range, '/', 1)) AS start_address, 
  POWER(2, 32-SUBSTRING_INDEX(range, '/', -1))-1 AS num_addresses
  FROM ipranges;
+---------------+---------------+
| start_address | num_addresses |
+---------------+---------------+
|      16777216 |           255 |
+---------------+---------------+

这个结果是我在'1.0.0.0/24'上测试这个查询时得出的。

然后,您可以检查您感兴趣的IP地址的INET_ATON()是否在此范围内,因为它只是一个整数范围。

代码语言:javascript
复制
SELECT range FROM (
    SELECT range, 
      INET_ATON(SUBSTRING_INDEX(range, '/', 1)) AS start_address, 
      POWER(2, 32-SUBSTRING_INDEX(range, '/', -1))-1 AS num_addresses
    FROM ipranges) AS t
WHERE INET_ATON('195.124.199.201') BETWEEN start_address AND start_address+num_addresses;

对于所有这些表达式,使用索引来优化SQL查询恐怕是不可能的。如果您需要在IP范围的大数据集上以高性能运行此操作,则需要考虑一种以不同方式存储数据的方法,以便对其进行索引。

但是,如果您只有少量的IP范围,即使是不可索引的查询也可能足够快。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49390105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档