我应该为MySQL存储什么类型的IP地址?

s6fujrry  于 2023-01-12  发布在  Mysql
关注(0)|答案(4)|浏览(125)

我本来打算用varchar(20),但我想知道如果我应该做INT并去掉句点,应该怎么做,什么会更好?为什么?

ghhkc1vu

ghhkc1vu1#

我猜您只对IPv4地址感兴趣,而对IPv6不感兴趣。
我将对列使用INT UNSIGNED,然后使用INET_ATONINET_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)
14ifxucb

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

xuo3flqw

xuo3flqw3#

如果您真的关心节省空间,可以将其打包为4字节的int。IPv4 IP地址的每个块可以有256个可能的值,这恰好是单个字节的范围。
-- Edit --〉我刚才描述的可以用他答案中链接的mysql函数f00来完成
然而,将其存储为字符串将保存一点编码时间。老实说,除非你在非常大的规模上这样做,否则密集存储格式的优化并不重要。

yacmzcpb

yacmzcpb4#

以防万一你已经从MySQL切换到MariaDB或者人们(像我一样)研究了如何在MariaDB中存储IP地址。
有一个新的数据类型称为INET6,它适用于两个IP版本。
文档可参见here

相关问题