Я загрузил ip-to-country.csv, который имеет диапазоны ip, которые отображаются в страны. Как хранить эти данные в базе данных и как я могу запросить, в каком диапазоне Ip-адрес должен знать, откуда поступает адрес Ip?Ip адрес в страну с базой данных
ответ
я написал небольшую 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());
}
Для IPv4 можно хранить в следующем формате:
- Преобразование IP-адреса в целых числах. Так 127.0.0.1 станет 2 147 483 649
- магазина вашего стола в виде тройной IPFrom Ипто Страна
- Строительства индексов IpFrom и Ипты
Когда вам нужно посмотреть на IP-адрес выполнить следующий запрос
SELECT Country from GeoIP where IpFrom < $IP and $IP < $IpTo
Это даст вам страну по IP-адресу
Hit: '... WHERE $ внутрибрюшинно МЕЖДУ ipFrom И ipTo' - просто лучше смотреть;) – Crozin
Вы можете создать индекс только для Ипто (высокой границы) значения диапазонов и использование Кер у:
select country from geoip where $ip <= ipTo limit 1
(это предполагается, что диапазоны не перекрываются, как в базе данных MaxMind)
По крайней мере, для базы данных MaxMind, это работает (есть объяснение здесь: http://andy.wordpress.com/2007/12/16/fast-mysql-range-queries-on-maxmind-geoip-tables/), и он примерно на 2 порядка быстрее, чем BETWEEN с требуемыми там индексами. Спасибо, ораз! Я видел это только после прочтения вашего анвера. –
Посмотрите на 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
Это отличный инструмент, но, к сожалению, мой сервер возвращает адреса ipv6. – newbie
У вас будут проблемы с адресами ipv6 в почти любом решении geoip прямо сейчас. его просто нет (и я не думаю, что есть базы данных geoip ipv6). , если вы действительно не используете ipv6, посмотрите, можете ли вы убедить ваш сервер говорить ipv4 (например, черным списком модуля ipv6 на linux). –
Привет, я нашел это http://www.ip2location.com/IPV6-COUNTRY.aspx, я не знаю, совместимо ли это с вашим решением .... – newbie