简体   繁体   English

在MySQL中存储/检索IPv4和IPv6地址

[英]storing/retrieving IPv4 & IPv6 addresses in MySQL

Sorry I don't know much about this subject, but all I'm looking for is a quick-and-easy solution for uniquely representing any IP address (v4/v6) in MySQL so I can easily retrieve the last time (if any) that a particular computer has visited my site. 对不起,我对这个主题知之甚少,但我正在寻找的是一个快速简便的解决方案,可以唯一地表示MySQL中的任何IP地址(v4 / v6),这样我就可以轻松地检索最后一次(如果有的话) )某台计算机访问过我的网站。

I don't need to do any computations on the addresses, just retrieval, so any unique representation should be ok. 我不需要对地址进行任何计算,只需检索,因此任何唯一的表示都应该没问题。 I do plan on storing a lot of these (don't have an estimate yet), so space may become a concern. 我计划存储很多这些(还没有估计),所以空间可能成为一个问题。

I've seen many solutions for storing IP addresses, but it's unclear which work for both versions. 我已经看到了很多用于存储IP地址的解决方案,但目前还不清楚这两个版本的工作。 MySQL's built-in INET_ATON doesn't seem to support IPv6. MySQL的内置INET_ATON似乎不支持IPv6。 PHP's inet_pton seems promising but requires prior knowledge of the address's format. PHP的inet_pton似乎很有希望,但需要事先知道地址的格式。 I'm also unsure about its usage (MySQL field type and writing the insertion statement via PHP). 我也不确定它的用法(MySQL字段类型和通过PHP编写插入语句)。 I've seen varchar(39) used to represent IPv6 addresses as strings, and I like that this solution is somewhat independent of server configuration; 我已经看到varchar(39)用来表示IPv6地址作为字符串,我喜欢这个解决方案在某种程度上独立于服务器配置; however, I'm a little uneasy about disk space. 但是,我对磁盘空间有点不安。 Would this approach be sufficient for all addresses that $_SERVER['HTTP_CLIENT_IP'] might output? 这种方法对于$ _SERVER ['HTTP_CLIENT_IP']可能输出的所有地址是否足够?

I'm a little surprised there isn't an obvious generic solution. 我有点惊讶没有一个明显的通用解决方案。 I assumed this was a very common task. 我认为这是一项非常普遍的任务。 I'm having indecision about this single issue, and would like to move on with my project. 我对这个问题犹豫不决,并希望继续我的项目。 Is a quick-and-easy solution unreasonable? 一个快速简便的解决方案是不合理的吗?

Thanks very much for any guidance... 非常感谢任何指导......

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

It sounds like your main concern is about space. 听起来你主要担心的是空间问题。 If that's the case, then you could use the fact that IPv4 addresses are (essentially) 32-bit numbers and IPv6 are 128. An IPv4 address can be stored in an INT column, but IPv6 would require two BIGINT columns in MySQL. 如果是这种情况,那么您可以使用IPv4地址(基本上)是32位数字而IPv6是128的事实.IP4地址可以存储在INT列中,但IPv6在MySQL中需要两个BIGINT列。 This is likely to be much more space-efficient than storing strings. 这可能比存储字符串更节省空间。

The cost of doing this is that you need to do the conversion from address -> number before inserting the value into the database. 这样做的代价是,在将值插入数据库之前,需要从地址 - >数字进行转换。 That will (slightly) increase CPU load on your web server, so you need to figure out where your bottleneck is going to be and optimise for that. 这将(略微)增加您的Web服务器上的CPU负载,因此您需要找出瓶颈所在的位置并进行优化。

An added benefit of storing the addresses as numbers is that you can have a very efficient index on the column(s) so looking up an address will be lightning fast. 将地址存储为数字的另一个好处是,您可以在列上拥有非常高效的索引,因此查找地址将非常快速。 Indexing varchar columns is very expensive. 索引varchar列非常昂贵。

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

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