Project closed
Статья

SQL формат. Конвертация IP адреса в IP номер

Таблица worldip содержит поля start, end и code. В одной строке записан один диапазон сети. start и end - это поля типа integer с IP номерами, code содержит двухбуквенный код страны, например "RU".
Конвертация IP адреса в IP номер происходит по следуюшей формуле:
IP Number = 16777216*A + 65536*B + 256*C + D
где IP Address = A.B.C.D
В PHP есть готовая функция, которая возвращает IP номер - ip2long($ip_address).
Например, IP адрес 91.121.147.207 конвертируется в IP номер 1534694351

Вы можете получить код страны из базы, например, таким запросом:
SELECT code FROM worldip WHERE start<=IP_NUMBER and end>=IP_NUMBER
Если вы инсталлируете вторую таблицу с названиями стран, то так можно получить и код и страну одним запросом:
SELECT wl.code,wl.country FROM worldip w LEFT JOIN worldip_land wl
 ON (w.code=wl.code) WHERE (w.start<=IP_NUMBER and w.end>=IP_NUMBER)
или только название страны:
SELECT wl.country FROM worldip_land wl LEFT JOIN worldip w
 ON (w.code=wl.code) WHERE (w.start<=IP_NUMBER and w.end>=IP_NUMBER)

Если вы используете API (чтобы получать более актуальные данные), вы можете поставить таблицу с названиями стран.
SELECT country FROM worldip_land WHERE code="GB"
вернет "United Kingdom" или "Великобритания" для русского варианта таблицы

Спасибо mgyk за подсказку использовать внутренние функции MySQL для преобразования адресов.
Во всех вышеперечисленных примерах можно заменить IP_NUMBER на inet_aton('IP_ADDR')
SELECT code FROM worldip WHERE 
(start<=inet_aton('77.77.77.77') and end>=inet_aton('77.77.77.77'))