2010-05-05 2 views
1

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

ответ

4

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

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

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

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());  
} 
+0

Это отличный инструмент, но, к сожалению, мой сервер возвращает адреса ipv6. – newbie

+0

У вас будут проблемы с адресами ipv6 в почти любом решении geoip прямо сейчас. его просто нет (и я не думаю, что есть базы данных geoip ipv6). , если вы действительно не используете ipv6, посмотрите, можете ли вы убедить ваш сервер говорить ipv4 (например, черным списком модуля ipv6 на linux). –

+0

Привет, я нашел это http://www.ip2location.com/IPV6-COUNTRY.aspx, я не знаю, совместимо ли это с вашим решением .... – newbie

2

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

  1. Преобразование IP-адреса в целых числах. Так 127.0.0.1 станет 2 147 483 649
  2. магазина вашего стола в виде тройной IPFrom Ипто Страна
  3. Строительства индексов IpFrom и Ипты

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

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

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

+0

Hit: '... WHERE $ внутрибрюшинно МЕЖДУ ipFrom И ipTo' - просто лучше смотреть;) – Crozin

1

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

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

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

+0

По крайней мере, для базы данных MaxMind, это работает (есть объяснение здесь: http://andy.wordpress.com/2007/12/16/fast-mysql-range-queries-on-maxmind-geoip-tables/), и он примерно на 2 порядка быстрее, чем BETWEEN с требуемыми там индексами. Спасибо, ораз! Я видел это только после прочтения вашего анвера. –

3

Посмотрите на IP-to-Country Handbook
Файл ф-к-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 Number, выполнив следующую Выберите заявление:

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

где IP Количество данного ABCD IP, вычисляется по формуле:

IP Number = A x (256*256*256) + B x (256*256) + C x 256 + D