СУБД MySQL и хранение IP адресов.
Довольно часто при web программировании (да и не только web) необходимо сохранять IP адреса в таблице СУБД MySQL. Самым простым кажется вариант сохранения в поле типа VARCHAR(15), но этот вариант имеет ряд недостатков. Например, объём и скорость обработки. В обоих случаях при сравнении с полями типа INT — VARCHAR проигрывает. Но как сохранить IP адрес в поле типа INTEGER?
Для этого в MySQL существует функция INET_ATON() и обратная ей INET_NTOA() .
Рассмотрим их в наглядных примерах.
Создадим таблицу, предназначенную для хранения IP адресов:
CREATE TABLEdb_example
.addr
(id
int(10) unsigned NOT NULL AUTO_INCREMENT,ip_addr
int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (id
) )
и наполним её данными:
INSERT INTO addr (ip_addr
) VALUES
(INET_ATON('122.141.251.42')),
(INET_ATON('218.2.0.129')),
(INET_ATON('122.225.109.205')),
(INET_ATON('61.183.1.8')),
(INET_ATON('122.225.109.219'));
В базе это выглядит так:
1 | |
2 | |
3 | |
4 | |
5 |
Теперь извлечём данные из таблицы используя функцию INET_NTOA():
SELECTid
, INET_NTOA(ip_addr
) FROM addr;
и в итоге получим:
4 | 218.2.0.129 |
3 | 122.141.251.42 |
5 | 122.225.109.205 |
6 | 61.183.1.8 |
7 | 122.225.109.219 |
Такой способ хранения IP адресов даёт возможность выборки по диапазону (например, адреса принадлежащие одному провайдеру):
SELECTid
, INET_NTOA(ip_addr
) FROMaddr
WHERE ip_addr BETWEEN INET_ATON('122.225.109.1') AND INET_ATON('122.225.109.255');
Комментов пока нет