Для IPv4-адресов вы можете сохранить их как int без знака
и использовать функции INET_ATON ()
и INET_NTOA ()
для вернуть IP-адрес из его числового значения и наоборот.
Пример:
SELECT INET_ATON('127.0.0.1');
+------------------------+
| INET_ATON('127.0.0.1') |
+------------------------+
| 2130706433 |
+------------------------+
1 row in set (0.00 sec)
SELECT INET_NTOA('2130706433');
+-------------------------+
| INET_NTOA('2130706433') |
+-------------------------+
| 127.0.0.1 |
+-------------------------+
1 row in set (0.02 sec)
Самое главное - убедиться, что столбец проиндексирован. Это может иметь огромное значение для запросов, основанных на IP-адресе.
Может быть, целочисленное значение сохранить непосредственно в целочисленном поле? IP-адрес в основном состоит из 4 "коротких".
Проверьте это: http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip
То, с чем вам легче всего работать. Проблема с размером или скоростью не является проблемой, пока вы не узнаете, что это проблема при профилировании. В некоторых случаях со строкой может быть проще работать, если вам нужно выполнить частичное сопоставление. Но из-за проблем с пространством или производительностью не беспокойтесь об этом, если у вас нет реальных причин для беспокойства.
Если вы хотите хранить только адреса IPv4, вы можете сохранить их в 32-битном целочисленном поле.
Если вы также хотите поддерживать IPv6, то строка, вероятно, является наиболее простым для чтения / использования способом (хотя технически вы можете сохранить их в 16-байтовом поле VARBINARY ()
, было бы утомительно пытаться сгенерировать операторы SQL для выбора по IP-адресу "вручную")