我本来打算用varchar(20),但我想知道如果我应该做INT并去掉句点,应该怎么做,什么会更好?为什么?
varchar(20)
ghhkc1vu1#
我猜您只对IPv4地址感兴趣,而对IPv6不感兴趣。我将对列使用INT UNSIGNED,然后使用INET_ATON和INET_NTOA在文本表示和int值之间来回转换。
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)
14ifxucb2#
将IPV4存储为无符号整数http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-atonhttp://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-ntoa
xuo3flqw3#
如果您真的关心节省空间,可以将其打包为4字节的int。IPv4 IP地址的每个块可以有256个可能的值,这恰好是单个字节的范围。-- Edit --〉我刚才描述的可以用他答案中链接的mysql函数f00来完成然而,将其存储为字符串将保存一点编码时间。老实说,除非你在非常大的规模上这样做,否则密集存储格式的优化并不重要。
yacmzcpb4#
以防万一你已经从MySQL切换到MariaDB或者人们(像我一样)研究了如何在MariaDB中存储IP地址。有一个新的数据类型称为INET6,它适用于两个IP版本。文档可参见here。
4条答案
按热度按时间ghhkc1vu1#
我猜您只对IPv4地址感兴趣,而对IPv6不感兴趣。
我将对列使用
INT UNSIGNED
,然后使用INET_ATON
和INET_NTOA
在文本表示和int值之间来回转换。14ifxucb2#
将IPV4存储为无符号整数
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
xuo3flqw3#
如果您真的关心节省空间,可以将其打包为4字节的int。IPv4 IP地址的每个块可以有256个可能的值,这恰好是单个字节的范围。
-- Edit --〉我刚才描述的可以用他答案中链接的mysql函数f00来完成
然而,将其存储为字符串将保存一点编码时间。老实说,除非你在非常大的规模上这样做,否则密集存储格式的优化并不重要。
yacmzcpb4#
以防万一你已经从MySQL切换到MariaDB或者人们(像我一样)研究了如何在MariaDB中存储IP地址。
有一个新的数据类型称为INET6,它适用于两个IP版本。
文档可参见here。