11

好的,现在我知道类似的问题可能已经被问过一百万次了,但我是这方面的真正新手,我非常感谢你在这里的帮助。

基本上,我想将访问者的 IP 地址存储在 MySQL 中,以供以后检索和验证。我首先需要知道我需要使用什么类型的字段来存储 IP 地址。如果可能的话,我还想让系统与 IPv6 地址兼容。

提前致谢

4

5 回答 5

12

要存储 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

于 2012-05-14T19:42:51.283 回答
6

我使用 VARBINARY(16) 作为数据类型,并使用 MySQL 函数INET_ATON()插入 IP 号(我后来使用 reverse 函数读取了INET_NTOA().

于 2012-05-14T19:40:08.257 回答
1

MySQL 中没有足够大的整数类型来存储 IPv6 地址。最紧凑的存储方式是BINARY(16). 如果您只需要存储和检索地址并且不需要对它们执行逻辑操作(例如,查询哪些 IP 地址位于覆盖前缀下的网络掩码操作),那么这就足够了。如果您需要进行逻辑或位操作,则需要更花哨:您需要将 IPv6 地址存储在两个单独的 64 位整数列中。

于 2012-05-14T19:38:24.483 回答
0

你是对的,但在 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

于 2019-12-24T11:42:14.147 回答
-1

int(10)未签名

http://lists.mysql.com/cluster/2781

于 2012-05-14T19:37:41.550 回答