检查 IP 是否在 MYSQL 范围内
Checking if IP is in a range in MYSQL
我有一个简单的 table,IP 范围如下(它们保存为 varchar,但如果需要我可以更改):
1.0.0.0/24
1.0.1.0/24
1.0.2.0/23
1.0.4.0/22
...etc
如何 select 给定 IP 地址所在的行属于该范围?
类似于:
SELECT range FROM ipranges WHERE '195.124.199.201' IN range
编辑:建议的重复答案 MySQL check if an IP-address is in range? 对我不起作用,因为它假定范围指定为两个 IP 地址,但我的符号使用斜线,我不知道如何在两者之间进行转换其中两个。
您需要使用 INET_ATON() 将 IPv4 地址格式转换为等效的无符号整数。
首先根据CIDR notation计算起始地址和结束地址。
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()是否在范围内,因为它只是一个整数范围。
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 范围,即使是不可索引的查询也可能足够快。
我有一个简单的 table,IP 范围如下(它们保存为 varchar,但如果需要我可以更改):
1.0.0.0/24
1.0.1.0/24
1.0.2.0/23
1.0.4.0/22
...etc
如何 select 给定 IP 地址所在的行属于该范围?
类似于:
SELECT range FROM ipranges WHERE '195.124.199.201' IN range
编辑:建议的重复答案 MySQL check if an IP-address is in range? 对我不起作用,因为它假定范围指定为两个 IP 地址,但我的符号使用斜线,我不知道如何在两者之间进行转换其中两个。
您需要使用 INET_ATON() 将 IPv4 地址格式转换为等效的无符号整数。
首先根据CIDR notation计算起始地址和结束地址。
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()是否在范围内,因为它只是一个整数范围。
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 范围,即使是不可索引的查询也可能足够快。