IP-адрес для страны с базой данных

Я скачал ip-to-country.csv, в котором есть диапазоны IP-адресов, привязанные к странам. Как я должен хранить эти данные в базе данных и как я могу запросить, в каком диапазоне IP-адрес должен знать, откуда исходит IP-адрес?


person newbie    schedule 05.05.2010    source источник


Ответы (4)


Для этого я написал небольшую библиотеку под названием ip2c. он использует базу данных с webhosting.info, но также поддерживает базу данных с Software77.

Он преобразует информацию CSV в компактный двоичный формат и может выполнять поиск прямо в файле, в памяти или в файле с отображением памяти.

Использование Java API похоже на это:

String ip = 85.64.225.159;
int caching1 = IP2Country.NO_CACHE;  // Straight on file, Fastest startup, slowest queries
int caching2 = IP2Country.MEMORY_MAPPED; // Memory mapped file, fast startup, fast queries.
int caching3 = IP2Country.MEMORY_CACHE; // load file into memory, slowerst startup, fastest queries
IP2Country ip2c = new IP2Country(caching1);
Country c = ip2c.getCountry(ip);
if (c == null)
{
        System.out.println("UNKNOWN");                          
}
else
{
        // will output IL ISR ISRAEL
        System.out.println(c.get2cStr() + " " + c.get3cStr() + " " + c.getName());      
}
person Omry Yadan    schedule 06.05.2010
comment
это отличный инструмент, но, к сожалению, мой сервер возвращает адреса ipv6 - person newbie; 07.05.2010
comment
Сейчас у вас будут проблемы с адресами ipv6 практически в любом решении geoip. его просто еще нет (и я не думаю, что есть базы данных ipv6 geoip). если вы на самом деле не используете ipv6, посмотрите, сможете ли вы убедить свой сервер использовать ipv4 (например, занеся модуль ipv6 в черный список в Linux). - person Omry Yadan; 09.05.2010
comment
Привет, я нашел это ip2location.com/IPV6-COUNTRY.aspx, я не знаю не знаю, совместимо ли это с вашим решением.... - person newbie; 12.05.2010
comment
этого не будет. мое решение будет работать только с этими двумя базами данных ipv4. может поддерживаться другая база данных ipv4, но не ipv6 (без серьезной перезаписи). - person Omry Yadan; 13.05.2010
comment
@Omry очень поздно, но я пытался использовать ваш проект в своем весеннем приложении mvc, но я получаю файл, который не найден ссылка пожалуйста, посмотрите, можете ли вы помочь, я много оглядывался и безуспешно - person Khizar; 02.03.2012

Ознакомьтесь с Руководством по IP-адресам в зависимости от страны
Файл ip-to-country.csv содержит пять полей:

* Begining of IP address range
* Ending of IP address range
* Two-character country code based on ISO 3166
* Three-character country code based on ISO 3166
* Country name based on ISO 3166

Вы можете импортировать эти данные в любую базу данных, создав таблицу со следующими полями:

FIELD           DATA TYPE           FIELD DESCRIPTION
IP_FROM         NUMERICAL (DOUBLE)  Beginning of IP address range.
IP_TO           NUMERICAL (DOUBLE)  Ending of IP address range.
COUNTRY_CODE2    CHAR(2)            Two-character country code based on ISO 3166.
COUNTRY_CODE3    CHAR(3)            Three-character country code based on ISO 3166.
COUNTRY_NAME     VARCHAR(50)        Country name based on ISO 3166

Вы можете запросить приведенную выше таблицу после того, как вы импортировали в нее данные, чтобы найти страну соответствующего IP-номер, введя следующий оператор Select:

SELECT COUNTRY_NAME FROM <TableName> WHERE IP_FROM <= IP Number and IP_TO >= IP Number

где IP-номер данного IP-адреса A.B.C.D рассчитывается по формуле:

IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D
person systempuntoout    schedule 06.05.2010

Для IPv4 вы можете хранить в следующем формате:

  1. Преобразование IP-адресов в целые числа. Таким образом, 127.0.0.1 станет 2 147 483 649.
  2. Сохраните свою таблицу как тройной IP From IPTo Country
  3. Строить индексы для IpFrom и IpTo

Когда вам нужно найти IP-адрес, выполните следующий запрос

SELECT Country from GeoIP where  IpFrom < $IP  and $IP < $IpTo

Это даст вам страну для IP-адреса

person Vlad    schedule 05.05.2010
comment
Попадание: ...WHERE $ip BETWEEN ipFrom AND ipTo - просто лучше выглядит ;) - person Crozin; 07.05.2010

Вы можете построить индекс только для значений ipTo (верхняя граница) диапазонов и использовать запрос:

  select country from geoip where $ip <= ipTo limit 1

(предполагается, что диапазоны не перекрываются, как в базе данных MaxMind)

person Oleg Razgulyaev    schedule 05.05.2010
comment
По крайней мере, для базы данных MaxMind это работает (здесь есть объяснение: andy.wordpress.com/2007/12/16/), и это примерно на 2 порядка быстрее, чем запрос BETWEEN с нужными там индексами. Спасибо ораз! Я увидел это только после прочтения вашего ответа. - person Ivan Maeder; 06.10.2012