将 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 列。