好的,现在我知道类似的问题可能已经被问过一百万次了,但我是这方面的真正新手,我非常感谢你在这里的帮助。
基本上,我想将访问者的 IP 地址存储在 MySQL 中,以供以后检索和验证。我首先需要知道我需要使用什么类型的字段来存储 IP 地址。如果可能的话,我还想让系统与 IPv6 地址兼容。
提前致谢
要存储 IPv4,您可以使用INT UNSIGNED
,而对于 IPv6,您需要 adecimal(39,0),
将 ip 存储在表中,您可以使用以下功能INET_ATON
:
INSERT INTO table (ipcol) VALUES (INET_ATON('192.168.0.10'));
并使用以下功能将其取回INET_NTOA
:
SELECT INET_NTOA(ipcol) AS ip FROM table;
这回答了 MySQL IPv6 支持之前存在的问题;用户应该知道 MySQL 现在原生支持 IPv6: https ://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html
我使用 VARBINARY(16) 作为数据类型,并使用 MySQL 函数INET_ATON()
插入 IP 号(我后来使用 reverse 函数读取了INET_NTOA()
.
MySQL 中没有足够大的整数类型来存储 IPv6 地址。最紧凑的存储方式是BINARY(16)
. 如果您只需要存储和检索地址并且不需要对它们执行逻辑操作(例如,查询哪些 IP 地址位于覆盖前缀下的网络掩码操作),那么这就足够了。如果您需要进行逻辑或位操作,则需要更花哨:您需要将 IPv6 地址存储在两个单独的 64 位整数列中。
你是对的,但在 MySQL 5.7 中,可以以十进制格式存储 IPV6。您也可以将 ipv6 转换为十进制,反之亦然:
MySQL 5.0 IPV4
select INET_ATON('192.168.0.1')
返回整数值:3232235521
MySQL 5.7 IPV6
select cast(conv(substr(HEX(INET6_ATON('0:0:0:0:0:FFFF:C0A8:0001')), 1, 16), 16, 10) as decimal(65))*18446744073709551616 +
cast(conv(substr(HEX(INET6_ATON('0:0:0:0:0:FFFF:C0A8:0001')), 17, 16), 16, 10) as decimal(65))
返回 bigint 值:281473913978881
int(10)
未签名