为什么这个查询在MySQL中返回正确的结果,在MariaDB中返回null结果?
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
发布于 2022-09-13 11:14:48
看起来问题就在~操作符中。对于MariaDB,它是定义如下
按位算了。将值转换为4字节二进制,并反转所有位。
当应用于INET6_ATON()的结果时,二进制值的长度会被截断。查询
select HEX(INET6_ATON('::')), HEX(~INET6_ATON('::'))在MariaDB will 产生下列值
HEX(INET6_ATON('::')) -> 00000000000000000000000000000000
HEX(~INET6_ATON('::')) -> FFFFFFFFFFFFFFFF(有趣的是,它将值转换为8个字节,而不是4个字节,至少对于运行在MariaDB上的https://dbfiddle.uk/服务器来说是这样)
HEX(INET6_ATON('::')) -> 00000000000000000000000000000000
HEX(~INET6_ATON('::')) -> FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF从那时起,在MariaDB中,所有剩余的位操作(比如移位)和&都会失败或产生不正确的值,这最终会导致0或null,在MySQL中,您将得到正确的结果。
https://stackoverflow.com/questions/73697968
复制相似问题