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未定义。
我的问题:
- 谁或哪里出了问题?
- 为什么?
- 我怎样才能让 perl 理解我提供给它的 IP 地址?
显然 MySQL 和 Net::IP
不同意使用 ::
来表示尾随 :0
。
据我了解RFC4191,fff: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
仍然应该接受它。修复任何一方的错误将解决问题。
我在 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未定义。
我的问题:
- 谁或哪里出了问题?
- 为什么?
- 我怎样才能让 perl 理解我提供给它的 IP 地址?
显然 MySQL 和 Net::IP
不同意使用 ::
来表示尾随 :0
。
据我了解RFC4191,fff: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
仍然应该接受它。修复任何一方的错误将解决问题。