好的,现在我知道类似的问题可能已被问过一百万次,但我是一个真正的新手,我非常感谢你的帮助。
基本上,我想将访问者的IP地址存储在MySQL中,以便以后检索和验证。我首先需要知道我需要使用哪种类型的字段来存储IP地址。如果可能的话,我还想让系统与IPv6地址兼容。
提前致谢
答案 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)
int(10)
无符号