2014-02-25 56 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查詢做到這一點? –