SQL: Przechowywanie IP w bazie danych

Wpis dotyczy tematu przechowywania adresów IP(dla ścisłości IPv4) w bazie danych MySQL. Najczęściej spotykanym sposobem przechowywania takiego adresu IP jest pole VARCHAR. Jest to zdecydowanie niewłaściwe podejście, wymaga zastosowania pola co najmniej VARCHAR(15), jednak w praktyce można spotkać nawet VARCHAR(100). Polecanym rozwiązaniem jest skorzystanie z pola UNSIGNED INT(4). Aby jednak wcisnąć adres IP do tego pola, potrzebna jest jego pewna obróbka, na szczęście zarówno PHP jak i MySQL posiadają funkcje pozwalające na obustronna konwersje adresów. Przejdźmy do praktyki i utwórzmy nasze pole:

CREATE TABLE IF NOT EXISTS `ips` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ip` int(4) unsigned NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

Aby wstawić do bazy danych adres IP 127.0.0.1 możemy skorzystać z zapytania:

INSERT INTO `ips` (ip) VALUES(INET_ATON('127.0.0.1'))

W bazie danych pojawi się wpis, który w polu ip będzie zawierał adres IP:

2130706433

Co pozwoli nam na odczyt adresu IP w znanej nam formie. Jak wspomniałem, czynności te można również wykonać z poziomu PHP. Służą do tego odpowiednio funkcje ip2long i long2ip

$ip = '127.0.0.1';
$encoded = ip2long($ip);
echo $encoded; //wyświetli 2130706433
$ip_2 = long2ip($encoded);
echo $ip_2; //wyświetli 127.0.0.1

Jak widać korzystanie z tego sposobu przechowywania adresów IP w bazie danych nie jest takie straszne jak mogłoby się wydawać. Pozatym, że rozwiązanie to jest dużo wydajniesze od zwykłego pola VARCHAR. Należy wspomnieć że udostępnia dodatkową funkcjonalność jak np. wyszukiwanie adresów IP z danego zakresu adresów, sprawdzanie czy adres należy do danej puli itd.