【问题标题】:Store both IPv4 and IPv6 address in a single column将 IPv4 和 IPv6 地址存储在单个列中
【发布时间】:2014-05-03 10:24:19
【问题描述】:

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

这将在生产环境中使用,因此首选经过验证的建议。

【问题讨论】:

  • IPv4 地址为 32 位长。 IPv6 地址的长度为 128 位。为了提高存储效率,IPv6 地址可以存储在BINARY(16) 列中,但是这对于 IPv4 地址来说效率很低,在INT UNSIGNED 列中会更好。
  • @AeroX 如果我使用 BINARY(16) ,我是否能够按原样存储 IP 地址,例如 192.168.1.2 或者我需要执行一些转换

标签: mysql ipv6 ipv4


【解决方案1】:

我建议以 IPv6 格式存储每个地址。有一个官方映射:IPv4-mapped IPv6 address。它的工作原理是这样的:

以IPv4地址192.0.2.44为例
IPv4 映射的 IPv6 地址将是 ::ffff:192.0.2.44
也可以写成::ffff:c000:022c192十进制是c0十六进制等)

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

另见this related answer

【讨论】:

  • 每个 ipv4 地址都有对应的 ipv6 吗?我还能将这些 ipv6 地址转换回 ipv4。你能建议为 mysql 存储 ipv6 所需的最佳数据类型和大小
  • 对 IPv6 地址使用 BINARY(16),如果您点击“相关答案”链接,您将看到如何转换回来。
【解决方案2】:

为什么它必须是单列?一些建议...

有 2 列,一列用于 IPv4,一列用于 IPv6。

将 IP 地址存储在单个列中,并有另一列基本上包含布尔值,无论地址是否为 IPv4...

【讨论】:

  • 这会浪费资源,因为 ipaddress 不是那么重要。我的意思是它只会在极少数情况下从数据库中检索。只需要一个版本
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2022-08-21
  • 2014-12-19
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多