MySQL 8.0新特性 -- bit-wise操作
2020-04-02 10:14 abce 阅读(993) 评论(0) 编辑 收藏 举报bit函数和操作符
名称 | 说明 |
& | 按位与 |
>> | 右移 |
<< | 左移 |
^ | 按位异或 |
bit_count() | 返回位数 |
| | 按位或 |
~ | 按位取反 |
在mysql8之前,bit函数和操作符只是支持64位的整数(bigint),返回值也是64位的整数(bigint)。所以最大支持到64位。非bigint参数会被转化成bigint,然后参与操作,所以可能会发生截断。
在8.0中,bit函数和操作符支持二进制字符串类型的参数,比如binary、varbinary、blob类型,返回值也是其对应的类型。这就使得可以接收和返回大于64bit的值。非二进制字符串会被转换成bigint类型后参与运算。
MySQL 8.0之前的bit操作
在8.0之前只是接收无符号的64位整形参数,返回值也是64无符号整形。其他类型会被转换成bigint:
·数字类型的字面值,会被当做无符号的64位整形对待:
1 2 3 4 5 6 | > select 127 | 128, 128 << 2, bit_count(15); + -----------+----------+---------------+ | 127 | 128 | 128 << 2 | bit_count(15) | + -----------+----------+---------------+ | 255 | 512 | 4 | + -----------+----------+---------------+ |
·字符串参与运算前,被转换成整形('127'转换成127)
1 2 3 4 5 6 | > select '127' | '128' , '128' << 2, bit_count( '15' ); + ---------------+------------+-----------------+ | '127' | '128' | '128' << 2 | bit_count( '15' ) | + ---------------+------------+-----------------+ | 255 | 512 | 4 | + ---------------+------------+-----------------+ |
·十六进制字面值进行bit操作。mysql默认是将十六进制当做二进制字符串,但是在数字上下文中是将其当做数字
1 2 3 4 5 6 | > select x '7f' | x '80' , x '80' << 2, bit_count(x '0f' ); + ---------------+------------+------------------+ | x '7f' | x '80' | x '80' << 2 | bit_count(x '0f' ) | + ---------------+------------+------------------+ | 255 | 512 | 4 | + ---------------+------------+------------------+ |
MySQL 8.0的bit操作
MySQL 8.0扩展了bit操作,可以直接处理二进制字符串参数,不再需要进行类型转换,产生的结果也是二进制字符串。但是和之前版本一样,非整形、或非二进制字符串类型的参数仍然会转换成整形。
这一扩展加强了bit操作的特性:
·bit操作可以在大于64bit的值上进行
·可以在二进制字符串上执行bit操作
比如uuid、ipv6,格式是人们可读的text字符串格式:
1 2 | UUID: 6ccd780c-baba-1026-9564-5b8c656024db IPv6: fe80::219:d1ff:fe91:1a72 |
在text字符串格式上操作这些通常比较麻烦,通常是将其转换成固定长度的二进制字符串(不带分隔符)。
1 2 3 4 5 6 7 8 9 10 11 12 13 | > select hex(uuid_to_bin( '6ccd780c-baba-1026-9564-5b8c656024db' )); + ----------------------------------------------------------+ | hex(uuid_to_bin( '6ccd780c-baba-1026-9564-5b8c656024db' )) | + ----------------------------------------------------------+ | 6CCD780CBABA102695645B8C656024DB | + ----------------------------------------------------------+ > select hex(inet6_aton( 'fe80::219:d1ff:fe91:1a72' )); + ---------------------------------------------+ | hex(inet6_aton( 'fe80::219:d1ff:fe91:1a72' )) | + ---------------------------------------------+ | FE800000000000000219D1FFFE911A72 | + ---------------------------------------------+ |
转换成二进制字符串后就容易操作了。
对于十六进制字面值和bit字面值,这些都是被mysql默认当做binary字符串,但是在数值context中是被当做数字。作为对老版本的兼容性,mysql8.0中,如果所有的参数都是十六进制或bit字面值,在数值context中仍然使用老的方式进行bit操作。
·十六进制和bit字面值作为整形参与bit操作:
1 2 3 4 5 6 | > select x '40' | x '01' , b '11110001' & b '01001111' ; + ---------------+---------------------------+ | x '40' | x '01' | b '11110001' & b '01001111' | + ---------------+---------------------------+ | 65 | 65 | + ---------------+---------------------------+ |
·由于_binary,会将十六进制字面值和bit字面值转成binary字符串:
1 2 3 4 5 6 | > select _binary x '40' | x '01' , b '11110001' & _binary b '01001111' ; + -----------------------+-----------------------------------+ | _binary x '40' | x '01' | b '11110001' & _binary b '01001111' | + -----------------------+-----------------------------------+ | A | A | + -----------------------+-----------------------------------+ |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)