在单个列中存储IPv4和IPv6地址

13

我希望能够在我的表中存储IPv4和IPv6地址。无论用户使用的是IPv4还是IPv6地址,最有效的存储IP地址的方法是什么?

由于这将用于生产环境,所以建议考虑未来的需求。


IPv4地址长度为32位。IPv6地址长度为128位。为了存储效率,IPv6地址可以存储在“BINARY(16)”列中,但对于IPv4地址来说,这种方式不够高效,最好使用“INT UNSIGNED”列。 - AeroX
1
相关:https://dev59.com/yG855IYBdhLWcg3wQx9L - AeroX
@AeroX 如果我使用 BINARY(16),是否可以将IP地址直接存储,例如192.168.1.2,还是需要执行某些转换? - user2650277
2个回答

11

我建议将每个地址都以IPv6格式存储。这方面有官方的映射: IPv4-mapped IPv6地址。它的工作方式如下:

例如,取IPv4地址192.0.2.44
对应的IPv4-mapped IPv6地址为::ffff:192.0.2.44
也可以写作::ffff:c000:022c (192十进制表示为c0十六进制,等等)

您可以使用inet_pton()函数解析此类地址,在我的本地系统上,inet_ntop()函数还以最可读的格式输出它们(::ffff:192.0.2.44)。这样,您的应用程序只需要处理一种格式。

还请参见此相关答案


每个IPv4地址都有一个IPv6等效地址吗?我能否将这些IPv6地址转换回IPv4?您能建议存储IPv6所需的最佳数据类型和大小,以供MySQL使用吗? - user2650277
1
使用BINARY(16)存储IPv6地址,如果您遵循“相关答案”链接,您将看到如何进行转换。 - Sander Steffann

1
为什么必须只有一个列?以下是一些建议:
1. 使用2个列,一个用于IPv4,另一个用于IPv6。 2. 在一个列中存储IP地址,并使用另一个列来保存一个布尔值,表示该地址是否为IPv4...

5
这将是一种浪费资源,因为ipaddress并不是非常重要。我的意思是它只有在罕见的情况下才需要从数据库中检索。只需要一个版本即可。 - user2650277

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接