为什么此查询在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个
200d:31c4:1905:9eb2:3c7f:c45c:8000::
null
yuvru6vn1#
看起来问题出在~运算符中。对于MariaDB,它是defined as follow:按位NOT。将值转换为4字节二进制并反转所有位。当应用于INET6_ATON()的结果时,二进制值的长度被截断。查询
~
INET6_ATON()
select HEX(INET6_ATON('::')), HEX(~INET6_ATON('::'))
将produce the following values:
HEX(INET6_ATON('::')) -> 00000000000000000000000000000000 HEX(~INET6_ATON('::')) -> FFFFFFFFFFFFFFFF
在MySQL中,按位求反运算符将为produce the following value:
HEX(INET6_ATON('::')) -> 00000000000000000000000000000000 HEX(~INET6_ATON('::')) -> FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
从那时起,在MariaDB中,所有剩余的位操作(如移位和&)都将失败或产生错误的值,最终导致0或null,而在MySQL中,您将得到正确的结果。
&
0
1条答案
按热度按时间yuvru6vn1#
看起来问题出在
~
运算符中。对于MariaDB,它是defined as follow:按位NOT。将值转换为4字节二进制并反转所有位。
当应用于
INET6_ATON()
的结果时,二进制值的长度被截断。查询将produce the following values:
在MySQL中,按位求反运算符将为produce the following value:
从那时起,在MariaDB中,所有剩余的位操作(如移位和
&
)都将失败或产生错误的值,最终导致0
或null
,而在MySQL中,您将得到正确的结果。