将 IPv4 IP 地址与存储在 MYSQL 上的网络地址进行比较
Comparing IPv4 IP address with Network address stored on MYSQL
我有一个很大的 table,其中包含 300 万个网络地址及其位置信息
基本领域:
network: eg. 74.142.124.116/30,
latitude: eg. 40475,
longitude: eg. 37.7548
系统还会捕获访问服务的用户的 ipv4 地址(例如,216.255.211.106
)。
我想比较这个 ipv4 和网络地址并找到 ip 地址。在 MySQL 或 node.JS 中有没有办法做到这一点?
您可以使用以下方法:
- 将网络作为 startIP 和 endIP(网络和广播)存储在 MySQL
的两个单独列中
- 使用简单的范围查询查找包含地址的记录 (
ip >= startIP and ip <= endIP
)
实施细节:
MySQL 中 IPv4 地址的最佳数据类型是 INT UNSIGNED
。您可以通过计算网络和广播地址来转换现有数据(使用您的示例数据):
update mytable set startIP = inet_aton('74.142.124.116'), endIP = inet_aton('74.142.124.119')
假设你的原始参数值(sourceIP)是点分十进制格式的IP地址字符串(即'216.255.211.106')你可以查询table(你需要在(startIP,结束IP)为:
select lat, long from mytable where inet_aton(@sourceIP) >= startIP and inet_aton(@sourceIP) <= endIP
(@sourceIP为参数值)
根据数据的质量,您可能会得到多个结果(即数据集中的重叠网络范围)
更新
感谢 Bernd Buffen 的回答
您可以使用以下语句来填充两个新列:
update mytable set
startIP = INET_ATON( SUBSTRING_INDEX(cidr, '/', 1))
& 0xffffffff ^ ((0x1 << ( 32 - SUBSTRING_INDEX(cidr, '/', -1)) ) -1 )
, endIP = INET_ATON( SUBSTRING_INDEX(cidr, '/', 1))
| ((0x100000000 >> SUBSTRING_INDEX(cidr, '/', -1) ) -1 )
假设原始 table 有一个 cidr
列。
我有一个很大的 table,其中包含 300 万个网络地址及其位置信息
基本领域:
network: eg. 74.142.124.116/30,
latitude: eg. 40475,
longitude: eg. 37.7548
系统还会捕获访问服务的用户的 ipv4 地址(例如,216.255.211.106
)。
我想比较这个 ipv4 和网络地址并找到 ip 地址。在 MySQL 或 node.JS 中有没有办法做到这一点?
您可以使用以下方法:
- 将网络作为 startIP 和 endIP(网络和广播)存储在 MySQL 的两个单独列中
- 使用简单的范围查询查找包含地址的记录 (
ip >= startIP and ip <= endIP
)
实施细节:
MySQL 中 IPv4 地址的最佳数据类型是 INT UNSIGNED
。您可以通过计算网络和广播地址来转换现有数据(使用您的示例数据):
update mytable set startIP = inet_aton('74.142.124.116'), endIP = inet_aton('74.142.124.119')
假设你的原始参数值(sourceIP)是点分十进制格式的IP地址字符串(即'216.255.211.106')你可以查询table(你需要在(startIP,结束IP)为:
select lat, long from mytable where inet_aton(@sourceIP) >= startIP and inet_aton(@sourceIP) <= endIP
(@sourceIP为参数值)
根据数据的质量,您可能会得到多个结果(即数据集中的重叠网络范围)
更新
感谢 Bernd Buffen 的回答
您可以使用以下语句来填充两个新列:
update mytable set
startIP = INET_ATON( SUBSTRING_INDEX(cidr, '/', 1))
& 0xffffffff ^ ((0x1 << ( 32 - SUBSTRING_INDEX(cidr, '/', -1)) ) -1 )
, endIP = INET_ATON( SUBSTRING_INDEX(cidr, '/', 1))
| ((0x100000000 >> SUBSTRING_INDEX(cidr, '/', -1) ) -1 )
假设原始 table 有一个 cidr
列。