首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MariaDB和ipv6操作

MariaDB和ipv6操作
EN

Stack Overflow用户
提问于 2022-09-13 05:40:23
回答 1查看 64关注 0票数 1

为什么这个查询在MySQL中返回正确的结果,在MariaDB中返回null结果?

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2022-09-13 11:14:48

看起来问题就在~操作符中。对于MariaDB,它是定义如下

按位算了。将值转换为4字节二进制,并反转所有位。

当应用于INET6_ATON()的结果时,二进制值的长度会被截断。查询

代码语言:javascript
复制
select HEX(INET6_ATON('::')), HEX(~INET6_ATON('::'))

在MariaDB will 产生下列值

代码语言:javascript
复制
HEX(INET6_ATON('::'))  -> 00000000000000000000000000000000
HEX(~INET6_ATON('::')) -> FFFFFFFFFFFFFFFF

(有趣的是,它将值转换为8个字节,而不是4个字节,至少对于运行在MariaDB上的https://dbfiddle.uk/服务器来说是这样)

就像在MySQL中一样,位负算子产生以下值

代码语言:javascript
复制
HEX(INET6_ATON('::'))  -> 00000000000000000000000000000000
HEX(~INET6_ATON('::')) -> FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73697968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档