Я скачал ip-to-country.csv, в котором есть диапазоны IP-адресов, привязанные к странам. Как я должен хранить эти данные в базе данных и как я могу запросить, в каком диапазоне IP-адрес должен знать, откуда исходит IP-адрес?
IP-адрес для страны с базой данных
Ответы (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());
}
Ознакомьтесь с Руководством по 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
Для IPv4 вы можете хранить в следующем формате:
- Преобразование IP-адресов в целые числа. Таким образом, 127.0.0.1 станет 2 147 483 649.
- Сохраните свою таблицу как тройной IP From IPTo Country
- Строить индексы для IpFrom и IpTo
Когда вам нужно найти IP-адрес, выполните следующий запрос
SELECT Country from GeoIP where IpFrom < $IP and $IP < $IpTo
Это даст вам страну для IP-адреса
...WHERE $ip BETWEEN ipFrom AND ipTo
- просто лучше выглядит ;)
- person Crozin; 07.05.2010
Вы можете построить индекс только для значений ipTo (верхняя граница) диапазонов и использовать запрос:
select country from geoip where $ip <= ipTo limit 1
(предполагается, что диапазоны не перекрываются, как в базе данных MaxMind)