Самый эффективный способ сохранить IP-адрес в MySQL [дубликат]

69
задан Hast 10 February 2014 в 18:58
поделиться

5 ответов

Для 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)
109
ответ дан 24 November 2019 в 13:41
поделиться

Самое главное - убедиться, что столбец проиндексирован. Это может иметь огромное значение для запросов, основанных на IP-адресе.

4
ответ дан 24 November 2019 в 13:41
поделиться

Может быть, целочисленное значение сохранить непосредственно в целочисленном поле? IP-адрес в основном состоит из 4 "коротких".

Проверьте это: http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip

1
ответ дан 24 November 2019 в 13:41
поделиться

То, с чем вам легче всего работать. Проблема с размером или скоростью не является проблемой, пока вы не узнаете, что это проблема при профилировании. В некоторых случаях со строкой может быть проще работать, если вам нужно выполнить частичное сопоставление. Но из-за проблем с пространством или производительностью не беспокойтесь об этом, если у вас нет реальных причин для беспокойства.

2
ответ дан 24 November 2019 в 13:41
поделиться

Если вы хотите хранить только адреса IPv4, вы можете сохранить их в 32-битном целочисленном поле.

Если вы также хотите поддерживать IPv6, то строка, вероятно, является наиболее простым для чтения / использования способом (хотя технически вы можете сохранить их в 16-байтовом поле VARBINARY () , было бы утомительно пытаться сгенерировать операторы SQL для выбора по IP-адресу "вручную")

58
ответ дан 24 November 2019 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: