mysql:从二进制ip和子网获取ipv6二进制网络掩码

voj3qocg  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(553)

我有一个表,将ipv6地址存储为二进制(16),子网存储为int(3)
我认为通过以下操作获得网络掩码很简单:

SELECT ~INET6_ATON('::') << (128 - subnet);

但它返回零,事实上,当我在二进制字符串上使用它们时,所有按位运算符似乎都提供整数结果:-(
我用的是10.1.30-mariadb

+-----------------+
| VERSION()       |
+-----------------+
| 10.1.30-MariaDB |
+-----------------+

非常感谢您的帮助。
编辑:我完全误解了玛丽亚的版本字符串,抱歉:-(

mfuanj7w

mfuanj7w1#

5.5中的位操作限制为64位(8.0放宽了限制。5.5已经很老了。如果升级,可以转储并重新加载,或者分3步升级:5.5->5.6->5.7->8.0)
你可能想要右转 >> . 或者也许 (1 << amt) - 1 . 示例(仅使用64位算术):

SELECT HEX(~((1 << 8) - 1)); --> FFFFFFFFFFFFFF00

“ipv6参考实现”链接中提供了一些128位操作http://mysql.rjweb.org/doc.php/ipranges . 这里没有“shift”功能,但是您可以调整技术(使用 HEX() )为了达到你的目的。它确实对ipv6值加/减1。这对于某些掩模构建和掩模操作非常方便。
如果你想解释一下你将如何处理这个结果 SELECT ,我也许能给你更多的答案。
(见5.7.11发行说明):
位函数和运算符包括bit_count()、bit_and()、bit_or()、bit_xor()、&、|、^、~、<<和>>。目前,位函数和运算符需要bigint(64位整数)参数并返回bigint值,因此它们的最大范围为64位。其他类型的参数转换为bigint,可能会发生截断。
mysql 8.0的一个扩展将这种强制转换更改为bigint行为:位函数和运算符允许二进制字符串类型的参数(binary、varbinary和blob类型),使它们能够获取参数并生成大于64位的返回值。因此,在MySQL5.7中对二进制字符串参数的位操作可能会在MySQL8.0中产生不同的结果。为了提前通知这种行为上的潜在变化,服务器现在为二进制字符串参数在mysql 8.0中未转换为整数的位操作生成警告。这些警告提供了重写受影响语句的机会。要以升级到8.0后不会改变的方式显式生成MySQL5.7行为,请将位操作二进制字符串参数转换为整数。有关更多信息和示例,请参阅位函数和运算符。

相关问题