在MySQL数据库中存储IP地址(IPv4和IPv6)

时间:2012-05-14 19:34:03

标签: php mysql ip ipv6 ipv4

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

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

提前致谢

5 个答案:

答案 0 :(得分:11)

要存储IPv4,您可以使用INT UNSIGNED,而对于IPv6,您需要decimal(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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您是对的,但是在MySQL 5.7中,可以将IPV6以十进制格式存储。 您也可以将ipv6转换为十进制,反之亦然:

MySQL 5.0 IPV4

select INET_ATON('192.168.0.1') 返回int值: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

答案 4 :(得分:-1)