IPv6 SQL 到 Perl

IPv6 SQL to Perl

我在 mysql table 中有一个字段作为 varbinary(16),它存储二进制 IPv6 地址。

在摆弄我的代码和测试东西时,我用以下二进制值填充了其中一条记录:

0fff0fff0fff0fff0fff0fff0fe00000

(这是我在phpmyadmin中看到的值)

当我用查询调用值时:

SELECT INET6_NTOA(value)
FROM table

我得到的return值为

fff:fff:fff:fff:fff:fff:fe0::

在 perl 中,当我尝试将其放入 Net::IP 对象中时:

$ip = new Net::IP('fff:fff:fff:fff:fff:fff:fe0::', 6);

return未定义。

我的问题:

显然 MySQL 和 Net::IP 不同意使用 :: 来表示尾随 :0

据我了解RFC4191fff:fff:fff:fff:fff:fff:fe0::应该是一个完全有效的IPv6地址(扩展为0fff:0fff:0fff:0fff:0fff:0fff:0fe0:0000),但Net::IP似乎并不同意。

Net::IP 似乎同意使用 :: 作为尾随 :0:0,但不只是 :0。用 :: 替换单个 :0: 也可以。看起来像一个错误。它可以追溯到 ip_is_ipv6,它认为 IPv6 地址不能有 8 个 :(这在所有情况下都是正确的,但单个前导或尾随 0 被 :: 替换)。

如果 IP 中有 8 个冒号,您可以进行一些预处理,将尾随 :: 替换为 :0,将前导 :: 替换为 0:

编辑

事实证明 RFC5952 表示单个 0(因此尾随 :0)不应在输出中被 :: 替换,因此 MySQL INET6_NTOA 有问题,但它仍然表示应接受符合 RFC4191 的地址作为输入,因此 Net::IP 仍然应该接受它。修复任何一方的错误将解决问题。