存储/检索IPv4& MySQL中的IPv6地址

时间:2011-10-02 18:58:53

标签: php mysql ipv6 ipv4

很抱歉,我对这个主题知之甚少,但我正在寻找的是一个快速简便的解决方案,可以唯一地表示MySQL中的任何IP地址(v4 / v6),这样我就可以轻松检索到最后一次(如果有的话)特定计算机访问过我的网站。

我不需要对地址进行任何计算,只需检索,因此任何唯一的表示都应该没问题。我确实计划存储很多这些(还没有估计),所以空间可能会成为一个问题。

我见过很多用于存储IP地址的解决方案,但目前还不清楚这两个版本的工作。 MySQL的内置INET_ATON似乎不支持IPv6。 PHP的inet_pton似乎很有希望,但需要事先知道地址的格式。我也不确定它的用法(MySQL字段类型和通过PHP编写插入语句)。我已经看到varchar(39)用来表示IPv6地址作为字符串,我喜欢这个解决方案在某种程度上独立于服务器配置;但是,我对磁盘空间有点不安。这种方法对于$ _SERVER ['HTTP_CLIENT_IP']可能输出的所有地址是否足够?

我有点惊讶没有明显的通用解决方案。我认为这是一项非常普遍的任务。我对这个问题犹豫不决,并希望继续我的项目。一个快速简便的解决方案是不合理的吗?

非常感谢任何指导...

2 个答案:

答案 0 :(得分:2)

我会这样做:来自那里的那个:How to store IPv6-compatible address in a relational database“做出最终决定:如果第二个bigint为NULL则为2xBIGINT,那么它意味着IPv4”

答案 1 :(得分:2)

听起来你的主要关注点是空间。如果是这种情况,那么你可以使用这样的事实:IPv4地址(基本上)是32位数字,IPv6是128. IPv4地址可以存储在INT列中,但IPv6需要两个{{1 MySQL中的列。这可能比存储字符串更节省空间。

这样做的代价是您需要从地址进行转换 - >将值插入数据库之前的数字。这将(略微)增加您的Web服务器上的CPU负载,因此您需要确定您的瓶颈将在哪里并为此进行优化。

将地址存储为数字的另一个好处是,您可以在列上拥有非常高效的索引,因此查找地址将非常快速。索引BIGINT列非常昂贵。