我本来要使用varchar(20)
, 但我想知道是否应该使用INT并去掉小数点。哪种方式更好,为什么?
我本来要使用varchar(20)
, 但我想知道是否应该使用INT并去掉小数点。哪种方式更好,为什么?
我假定您只对IPv4地址感兴趣,而不是IPv6。
我会使用一个INT UNSIGNED
列,然后使用INET_ATON
和INET_NTOA
来在文本表示和整数值之间进行转换。
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)
如果你真的关心节省空间,你可以将它打包成一个4字节的整数。IPv4 IP地址的每个块可以有256个可能的值,这恰好是单个字节的范围。
-- 编辑 --> 正如f00在他的答案中链接的mysql函数所描述的那样,可以使用该方法实现。
然而,将其存储为字符串将节省一些编码时间。老实说,除非你在非常大的规模上进行此操作,否则从更密集的存储格式进行优化并不重要。