Как хранить IP-адрес (MySQL)

Хранить IP-адрес можно в поле типа VARCHAR(15), но лучше в поле типа UNSIGNED INT. В MySQL есть функция INET_ATON(), которая преобразует IP-адрес в тип INT.

Если необходимо искать IP-адрес в каком-либо диапазоне, например при определении города, то хранить придется только в UNSIGNED INT..

Таблица IP-адресов

Создадим таблицу IP-адресов.

CREATE TABLE `test`.`ip` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `ip1` int(10) unsigned NOT NULL DEFAULT '0', `ip2` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB;

Заполнение

Заполним таблицу несколькими записями.

INSERT INTO ip (`ip1`, `ip2`) VALUES (INET_ATON('1.1.1.1'), INET_ATON('10.10.10.10')), (INET_ATON('11.11.11.11'), INET_ATON('20.20.20.20')), (INET_ATON('94.100.100.0'), INET_ATON('94.255.255.255')), (INET_ATON('140.1.1.1'), INET_ATON('170.255.255.255')), (INET_ATON('200.1.1.1'), INET_ATON('255.255.255.255'));

Выборка данных

Так же в MySQL есть функция INET_NTOA() — преобразование числа в IP-адрес.

SELECT `id`, `ip1`, INET_NTOA(`ip1`), `ip2`, INET_NTOA(`ip2`) FROM ip i;
id ip1 INET_NTOA(`ip1`) ip2 INET_NTOA(`ip2`)
1168430091.1.1.116843009010.10.10.10
218527309911.11.11.1133686018020.20.20.20
3158363750494.100.100.0159383551994.255.255.255
42348876033140.1.1.12868903935170.255.255.255
53355508993200.1.1.14294967295255.255.255.255

Как видно из результатов функция INET_NTOA() отлично преобразует число обратно в исходный IP-адрес.

Выбор из диапазона IP-адресов

Например у нас есть IP-адрес 225.43.64.221 — INET_ATON('225.43.64.221') равен 3777708253.

SELECT `id`, `ip1`, `ip2` FROM `ip` WHERE INET_ATON('225.43.64.221') BETWEEN `ip1` AND `ip2`;

Результат

IP-адрес входит в один из диапазонов.

id ip1 ip2
533555089934294967295

Категории

СУБДMySQL

Комментарии

Артём Фёдоров

Что значит пропустить?

Ответить
Серожа Кривой

Подскажите а как пропустить пару адресов из вашего диапозона ?

Ответить
Артём Фёдоров

Всегда пожалуйста.

Ответить
Евгений Сусков

Спасибо за статью. Проверил - все работает!

Ответить