База данных MySQL с IP-адресами и их привязками к географическим объектам
В этой базе находятся соответствия IP-адресов и географических объектов с указанием города, страны, штата или региона, почтовый индекс и даже широта и долгота!
В дампе базы есть следующие таблицы:
- cities : Города мира (страна, регион, широта, долгота, класс IP-адреса)
- fips_countries : Страны мира (код, имя)
- fips_regions : Регионы
- ip_group_city : Местонахождение IP-адресов (по стране, региону, городу, почтовому индексу, широте и долготе)
Как пользоваться?
IP-адреса находятся в таблицах ip_group_city и ip_group_country и вычисляются по формуле (например для IP A.B.C.D):
ip = (A*256+B)*256+C
Точность до последнего октета на так важна :)
Например, у нас есть IP 74.125.45.100 (google)
Приводим его к виду, сохраненному в БД
ip = (74*256+125)*256+45 = 4881709
И делаем запрос:
SELECT * FROM `ip_group_city` where `ip_start` <= 4881709 order by ip_start desc limit 1;
Результат:
ip_start|country_code|region_code|city|zipcode|latitude|longitude 4881664|US|CA|Mountain View|94043|37.4192|-122.057
Почему в базе данных лишь 1,2 миллионов записей, в то время как в действительности IP-адресов больше чуть ли не в 10 раз???
Пусть IP с 74.125.0.XXX по 74.125.32.XXX расположены близко друг к другу (принадлежат Google, например) Если бы в базе 32 раза была бы сохранена одна и таже информация, то размер базы был бы огромным! Поэтому в базе лежит лишь 74.125.0.XXX. Следующая строка начнется с 74.125.33.XXX
10.02.09 | *NIX, MySQL articles | Comments (7)
Это для тех, кто не осилил geoip?
Интересное в сети…
[...]графических объектов с указанием города, страны, штата или региона, почтовый индекс и даже широта и …
<<Это для тех, кто не осилил geoip?
Думаю,что не только для них)Вообще не помешает)
Спасибо,правда ширина и долгота мне лично не нужны,но все остальное очень даже интересно!
<<<<Почему в базе данных лишь 1,2 миллионов записей, в то время как в действительности IP-адресов больше чуть ли не в 10 раз???
Хм…ну может некоторые под серьезной защитой?
Hi, инфа – супер, а как или где сделать привязку к часовым поясам, буду весьма признателен…..
На самом деле немного не правильно описанно в данной статье…
IP правильно по базе высчитывать так:
function ip2int($ip) {
$a=explode(“.”,$ip);
return $a[0]*256*256*256+$a[1]*256*256+$a[2]*256+$a[3];
}
Убедился сейчас сам. Так как написанно в статье не правлиьно.