2

从 MySQL 5.6 开始,它添加了一些与 IPv6 相关的功能。

我想知道为什么新函数IS_IPV4_COMPAT(expr)使用已弃用的 RFC-4291 来检查给定binary地址是否是有效的与 IPv4 兼容的 IPv6 地址。

MySQL 文档说:

此函数采用以数字形式表示的 IPv6 地址作为二进制字符串,由 INET6_ATON() 返回。如果参数是有效的与 IPv4 兼容的 IPv6 地址,则返回 1,否则返回 0。IPv4 兼容地址的格式为 ::ipv4_address。

mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9'));
    -> 1
mysql> SELECT IS_IPV4_COMPAT(INET6_ATON('::ffff:10.0.5.9'));
    -> 0

But the [RFC-4291](https://www.rfc-editor.org/rfc/rfc4291#section-2.5.5) says:

    +--------------------------------------+--------------------------+
    |                80 bits               | 16 |      32 bits        |
    +--------------------------------------+--------------------------+
    |0000..............................0000|0000|    IPv4 address     |
    +--------------------------------------+----+---------------------+

> The "IPv4-Compatible IPv6 address" is now deprecated because the current IPv6 transition mechanisms no longer use these addresses. New or updated implementations are not required to support this address type.

    +--------------------------------------+----+---------------------+
    |                80 bits               | 16 |      32 bits        |
    +--------------------------------------+--------------------------+
    |0000..............................0000|FFFF|    IPv4 address     |
    +--------------------------------------+----+---------------------+

> See [RFC4038](https://www.rfc-editor.org/rfc/rfc4038) for background on the usage of the "IPv4-mapped IPv6 address".

**Which format should I use to store IPv4 addresses within a IPv6 context?**
4

1 回答 1

3

在 IPv6 网络中寻址 IPv4 有两种方法。“映射”地址方案和“兼容性”地址。RFC-4291 讨论了它们。MySQL 允许您分别查询这两个。兼容地址方案已被弃用。

IS_IPV4_COMPAT() 用于兼容地址方案。即使不推荐使用,也有实现它的实现,并且仍在使用中,人们可能需要将它们存储在数据库中。

如果您想要映射地址方案的行为,请使用 IS_IPV4_MAPPED。

您应该使用哪种格式取决于您需要使用它们的目的。例如,如果您存储输入到计算机配置的地址,您需要知道它们支持哪种格式。如果您不知道,请使用较新的当前格式 (::ffff:10.0.5.9)

如果您需要同时支持这两种格式,请使用IS_IPV4_COMPAT(field) or IS_IPV4_MAPPED(field)wyhen 查询。

于 2013-10-24T13:46:14.347 回答