2012-05-14 151 views
6

好吧,现在我知道类似的问题可能已经被提出了一百万次,但我真的是新手,我非常感谢您的帮助。在MySQL数据库(IPv4和IPv6)中存储IP地址

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

在此先感谢

+1

你对地址的主要用例是什么?你要查询他们吗?将它们拆分并根据一些子网规则进行查询?或者他们存储只是为了显示? –

+2

试试这个:http://stackoverflow.com/questions/2049681/store-ipv6-in-database – Mark

+0

那么它的确认链接。我想确保确认链接是从它生成的相同IP地址访问的。所以我要去查询他们] – Andy

回答

9

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

+0

谢谢,但我想我刚刚读到'INET_ATON()'不支持IPv6。即使这样做,我如何使用PHP获取IPv6地址? – Andy

+0

尝试使用inet_pton:http://php.net/manual/en/function.inet-pton.php – aleroot

+0

够公平的,谢谢。现在,我该如何去查找PHP中的用户IP地址? – Andy

1

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

+0

不,我不需要做任何更花哨的事情(只是在查询中检索/比较它们)。所以我现在需要知道的是如何使用PHP获取用户的IP地址? – Andy

4

我使用VARBINARY(16),用于对数据类型和使用MySQL函数INET_ATON()插入IP号码(我使用反向功能,INET_NTOA()稍后读取。

+0

那么,VARBINARY(16)会支持IPv4和IPv6吗?我如何使用PHP找到访问者的IP地址? – Andy

+1

你必须使用INET6_NTOA和INTE6_ATON,但是直到版本5.6.3才能在MySQL中使用 –