Каков наиболее эффективный способ хранения и получения IP-адресов в MySQL? Сейчас я делаю:
SELECT * FROM logins WHERE ip = '1.2.3.4'
Где ip - это поле VARCHAR(15)
.
Есть ли лучший способ сделать это?
Каков наиболее эффективный способ хранения и получения IP-адресов в MySQL? Сейчас я делаю:
SELECT * FROM logins WHERE ip = '1.2.3.4'
Где ip - это поле VARCHAR(15)
.
Есть ли лучший способ сделать это?
Для IPv4-адресов, вы можете сохранить их как int unsigned
и использовать 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)
Если вы хотите хранить IPv4-адреса, вы можете сохранить их в 32-разрядном целочисленном поле.
Если вы хотите также поддерживать IPv6, то строка, вероятно, является самым простым для чтения/используемым способом (хотя вы можете технически сохранить их в 16-байтовом поле VARBINARY()
, было бы очень неприятно пытаться генерировать операторы SQL для выбора по IP-адресу "вручную" )
Самое главное - убедиться, что колонка индексирована. Это может иметь огромное значение для запросов на основе IP-адреса.
возможно сохранить целочисленное значение непосредственно в целочисленном поле? IP-адрес - это в основном 4 "шорты".
Проверьте это: http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip
Что бы ни было проще для вас работать. Вопрос о размере или скорости не является проблемой, пока вы не знаете, что это проблема при профилировании. В некоторых случаях для упрощения работы с цепочкой может быть проще работать, если вам нужно выполнить частичное сопоставление. Но, как вопрос о пространстве или производительности, не беспокойтесь об этом, если у вас нет реальной причины беспокоиться об этом.