Я собирался использовать varchar(20)
, но мне было интересно, что делать, если я должен сделать INT и отменить периоды. Что было бы лучше и почему?
Какой тип я должен хранить IP-адреса для MySQL?
Ответ 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)
Ответ 2
хранить IPV4 как int unsigned
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-ntoa
Ответ 3
Если вы действительно обеспокоены экономией места, вы можете упаковать его в 4-байтовый int. Каждый блок IPv4 IP-адреса может иметь 256 возможных значений, которые просто являются диапазоном одного байта.
- Изменить → То, что я только что описал, может быть выполнено с помощью функций mysql f00, связанных в его ответе
Однако сохранение его в виде строки приведет к сокращению времени кодирования. Честно говоря, если вы не делаете это в очень больших масштабах, оптимизация из более плотного формата хранения не имеет значения.