2014-02-25 60 views
3

有谁知道如何使用SQL从MaxMind的GeoLite2国家CSV查找IP4地址?在SQL中查询GeoLite2国家CSV

我一直在使用MaxMind免费的GeoIP数据多年,并想升级到他们的GeoLite2数据。我将块和位置数据加载到MySQL表中,但我不确定如何确定IP4地址落入的地址范围。旧格式有每个块的开始/结束编号;新格式似乎只有一个起始号码。

我已经通过MaxMind开发人员文档和谷歌搜索,但似乎无法找到任何有关如何查询新格式的信息。我相信这是很明显的,如果我在过渡期中弄明白这一点,我会编辑这篇文章。

认为谢谢我必须找到第一个块大于或等于IP4地址,并且可能是LIMIT 1。

我使用这些数据既可用于Web应用程序外观,也可用于直接在SQL中查询以生成报告;所以我通常需要确保我可以在Perl代码和纯SQL中实现查找。

我正在升级,因为我看到日本访问者在旧数据上显示来自法国的一些有趣结果。

许多感谢

回答

2

在Geolite2 CSV使用的地址格式包括块的IP地址开始,接着是前缀长度#,其可以被转换成块的IP地址端。

(有点混乱,的MaxMind使用 “Network_Mask_Length” 而不是 “的prefix_length”,所接受的IPv6术语,以标记该字段。)

Geolite2 CSV的块字段布局:

network_start_ip,network_mask_length,geoname_id,registered_country_geoname_id,re 
presented_country_geoname_id,postal_code,latitude,longitude,is_anonymous_proxy,i 
s_satellite_provider 

例: (提取自Geolite2-Country-Blocks.csv的记录)

::ffff:81.248.136.0,120,3578476,3017382,,,,,0,0 

鉴于上述例子,分配给该块的最后一个IPv4地址是什么?

First IP address: 81.248.136.0 
Prefix_Length/Network_mask_Length: 120 
Last IP address: 81.248.136.255 

以下网址可能是方便快速查找可用IP地址数量为特定的prefix_length:

http://www.gestioip.net/cgi-bin/subnet_calculator.cgi

__philippe

+0

啊哈!非常感谢__philippe,这很完美。由于缺乏网络知识,我不知道network_mask_length是关键。我现在可以看到它和开始地址之间的关系。非常感谢! –

+0

这对我也很有帮助。虽然,作为一个没有丰富的IP地址工作经验的人,但我无法理解如何计算给定第一个IP地址和前缀长度/网络掩码长度的最后一个IP地址。我检查了计算器,但我不确定如何使用它。谢谢! –

+3

具体来说,你介意如何从81.248.136.0和120得到81.248.136.255? –

1

的prefix_length计算器用法:

(在这种情况下,更多简单的查表工具比一个计算器,真的... ;-)

http://www.gestioip.net/cgi-bin/subnet_calculator.cgi

在计算器中,勾选IPv6的按钮,然后单击PL框向下箭头。 将显示“前缀长度”列表,以及相应的可用IP地址数量。

要确定任何Geolite2块的最后一个IP地址,的prefix_length /地址对应该最有可能就够了以下相关范围:

Prefix #addresses 
Length 

117 2048 
118 1024 
119 512 
120 256 
121 128 
122 64 
123 32 
124 16 
125 8 
126 4 
127 2 
128 1 

注意,Geolite2文件结构如下混合的IPv4/IPv6的一种形式符号,又名 “IPv4映射的IPv6地址”。

这些“混合”地址是用标准IPv6格式的前96位写入的,剩下的32位用IPv4的惯用点十进制表示法写入。 例如,:: FFFF:192.0.2.128表示IPv4地址192.0.2.128

有关这个非常(毛毛)受得多了,点击这里:

http://en.wikipedia.org/wiki/IPv6

__philippe

+0

我们可以用postgreSQL来实现这种情况吗?或任何建议通过SQL查询做到这一点? –