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


storing/retrieving IPv4 & IPv6 addresses in MySQL

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

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

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

我有点惊讶没有一个明显的通用解决方案。我以为这是一个很常见的任务。我对这个单一的问题犹豫不决,我想继续我的项目。快速简单的解决方案不合理吗?

我会这样做:从那里:如何在关系数据库中存储ipv6兼容地址"最终决定:2xBIGINT如果第二个bigint是NULL,那么它意味着IPv4"

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

这样做的代价是,在将值插入数据库之前,需要进行从address -> number的转换。这会(稍微)增加你的web服务器的CPU负载,所以你需要找出你的瓶颈在哪里,并为此进行优化。

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