MariaDB和ipv6操作

2sbarzqh  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(259)

为什么此查询在MySQL中返回正确结果,而在MariaDB中返回空结果?

select inet6_ntoa(inet6_aton('200d:31c4:1905:9eb2:3c7f:c45c:de78:42cd') & ((~INET6_ATON('::') << (128 - 97))))

返回MySQL中的:
200d:31c4:1905:9eb2:3c7f:c45c:8000::
MariaDB中的退货:
null

yuvru6vn

yuvru6vn1#

看起来问题出在~运算符中。对于MariaDB,它是defined as follow
按位NOT。将值转换为4字节二进制并反转所有位。
当应用于INET6_ATON()的结果时,二进制值的长度被截断。查询

select HEX(INET6_ATON('::')), HEX(~INET6_ATON('::'))

produce the following values

HEX(INET6_ATON('::'))  -> 00000000000000000000000000000000
HEX(~INET6_ATON('::')) -> FFFFFFFFFFFFFFFF
  • (有趣的是,它将值转换为8个字节而不是4个字节,至少对于运行在https://dbfiddle.uk/上的MariaDB服务器是这样)*

在MySQL中,按位求反运算符将为produce the following value

HEX(INET6_ATON('::'))  -> 00000000000000000000000000000000
HEX(~INET6_ATON('::')) -> FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

从那时起,在MariaDB中,所有剩余的位操作(如移位和&)都将失败或产生错误的值,最终导致0null,而在MySQL中,您将得到正确的结果。

相关问题