繁体   English   中英

在MySQL中存储/检索IPv4和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']可能输出的所有地址是否足够?

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

非常感谢任何指导......

我会这样:来自那里的citat: 如何在关系数据库中存储与IPv6兼容的地址 “最终决定:如果第二个bigint为NULL则为2xBIGINT,则表示IPv4”

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM