我有一个表,将ipv6地址存储为二进制(16),子网存储为int(3)
我认为通过以下操作获得网络掩码很简单:
SELECT ~INET6_ATON('::') << (128 - subnet);
但它返回零,事实上,当我在二进制字符串上使用它们时,所有按位运算符似乎都提供整数结果:-(
我用的是10.1.30-mariadb
+-----------------+
| VERSION() |
+-----------------+
| 10.1.30-MariaDB |
+-----------------+
非常感谢您的帮助。
编辑:我完全误解了玛丽亚的版本字符串,抱歉:-(
1条答案
按热度按时间mfuanj7w1#
5.5中的位操作限制为64位(8.0放宽了限制。5.5已经很老了。如果升级,可以转储并重新加载,或者分3步升级:5.5->5.6->5.7->8.0)
你可能想要右转
>>
. 或者也许(1 << amt) - 1
. 示例(仅使用64位算术):“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行为,请将位操作二进制字符串参数转换为整数。有关更多信息和示例,请参阅位函数和运算符。