Как в mysql лучше всего хранить ip адрес? Varchar или int? По вашему мнению, бывают ли ситуации, когда нужно производить поиск по ip адресам, например ip > 127.0.0.1. Какие функции преобразование ip адреса есть в MySQL, а какие есть в php? Равнозначны ли они?
Как в mysql лучше всего хранить ip адрес?
1 ответ
|
Наиболее удобно ip-адрес в MySQL хранить в типе INT. Причём обязательно UNSIGNED (беззнаковый), чтобы адреса выше 127. вполне вмещались в эти 4 байта. `ip` int(10) unsigned NOT NULL Тип INT более удобен для хранения ip-адресов по сравнению с CHAR(15) по двум причинам:
Имеется недостаток по сравнению с хранением ip как plaintxt (char или varchar) в mysql:
Как видно, достоинства хранения ip в UNSIGNED INT сильно превосходят единственный недостаток. Функции преобразования ip-адреса в mysql:
Для простоты запоминания нужно знать расшифровку аббревиатуры:
Примеры преобразования IP в mysql: SELECT INET_NTOA(ip) FROM tablename LIMIT 10; # выведет ip в обычном строковом формате SELECT INET_ATON('127.0.0.1'); #2130706433 SELECT INET_ATON('93.125.99.10'); #1568498442 SELECT INET_NTOA(2130706433); #127.0.0.1 SELECT INET_NTOA(1568498442); #93.125.99.10 Аналогичные функции преобразования ip-адреса в PHP:
ip2long('127.0.0'); //false ip2long('93.125.99.10'); //1568498442 ip2long('127.0.0.1'); //2130706433 ip2long('192.168.0.1'); //3232235521 long2ip('1568498442'); //93.125.99.10 long2ip('2130706433'); //127.0.0.1 long2ip('3232235521'); //192.168.0.1 Задача. Нам нужно получить все записи, которые находятся в диапазоне адресов 148.100.0.0 — 158.255.255.255. Если хранить IP в виде строк, то пришлось бы производить поиск с помощью регулярных выражений, а запрос выполнялся бы очень долго. В случае хранения IP-адреса в типе INT sql-запрос будет таким: SELECT .... WHERE ip BETWEEN INET_ATON('148.100.0.0') AND INET_ATON('158.255.255.255')
|
||||
|