Какой тип я должен хранить IP-адреса для MySQL?

Я собирался использовать varchar(20), но мне было интересно, что делать, если я должен сделать INT и отменить периоды. Что было бы лучше и почему?

Ответ 1

Я предполагаю, что вас интересуют только адреса IPv4, а не IPv6.

Я бы использовал INT UNSIGNED для столбца, а затем использовал INET_ATON и INET_NTOA для конвертирования между текстовым представлением и значением int.

mysql> SELECT INET_ATON('192.168.10.50');
+----------------------------+
| INET_ATON('192.168.10.50') |
+----------------------------+
|                 3232238130 |
+----------------------------+
1 row in set (0.00 sec)

mysql> SELECT INET_NTOA(3232238130);
+-----------------------+
| INET_NTOA(3232238130) |
+-----------------------+
| 192.168.10.50         |
+-----------------------+
1 row in set (0.00 sec)

Ответ 3

Если вы действительно обеспокоены экономией места, вы можете упаковать его в 4-байтовый int. Каждый блок IPv4 IP-адреса может иметь 256 возможных значений, которые просто являются диапазоном одного байта.

- Изменить → То, что я только что описал, может быть выполнено с помощью функций mysql f00, связанных в его ответе

Однако сохранение его в виде строки приведет к сокращению времени кодирования. Честно говоря, если вы не делаете это в очень больших масштабах, оптимизация из более плотного формата хранения не имеет значения.