MySQL 的 INET6_ATON() 的输出与 PHP 的 inet_ntop() 函数兼容吗?

问题描述 投票:0回答:1

MySQL 的 INET6_ATON 将 ipv4 或 ipv6 地址转换为二进制表示形式。 PHP 的 inet_ntop() 应该读取 ipv4 或 ipv6 地址的二进制表示形式,并将其转换为人类可读的形式。但 php.net 上的一条旧评论说它们不兼容: https://www.php.net/manual/en/function.inet-ntop.php#117398 自 6 年前的评论以来,PHP 和 MySQL 都经历了多次迭代,所以我不知道这种不兼容性是否仍然存在(或者是否曾经存在过)。

我不知道如何将二进制数据直接从MySQL复制到PHP,所以我先将二进制转换为十六进制。这是我到目前为止所做的:

SELECT HEX(INET6_ATON('::1')); # gives 00000000000000000000000000000001

我将其输出放入 PHP 的 sinet_ntop() 中:

var_dump(inet_ntop(hex2bin('00000000000000000000000000000001'))); # gives ::1

它似乎有效,但评论仍然让我担心,因为我不知道如何在不先进行十六进制转换的情况下测试它,并且对 IP 地址缺乏熟悉。

PHP 能否始终在 MySQL 的 INET6_ATON() 输出上成功运行 inet_ntop() ?

php mysql
1个回答
0
投票

在 PHP 7.4 中,它们仍然不是 100% 与 IPv6 二进制值兼容。

在 99.9999% 的情况下,它会产生正确的 IP,但随后它会执行类似的操作

2001:4ca0:0:fe00:0:5efe:10.155.251.109 //PHP 7.4.7

而不是

2001:4ca0::fe00:0:5efe:a9b:fb6d  //MariaDB 10.6.11

或者将在地址

false
上完全失败(返回
2001:718:1001:700:200:5efe:9ec4:7279
)。

它们处理零的方式也存在差异。 MySQL 将零替换为

::
,而 PHP 将它们保留为
:0:

从10M IP地址测试来看,只有这两个问题,所以速率确实很低,如果需要依赖该值还是有问题。

© www.soinside.com 2019 - 2024. All rights reserved.