mysql bit操作_MySQL 8.0新特性 -- bit-wise操作

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位整形对待:

>select 127 | 128, 128 << 2, bit_count(15);

+-----------+----------+---------------+

| 127 | 128 | 128 << 2 | bit_count(15) |

+-----------+----------+---------------+

| 255 | 512 | 4 |

+-----------+----------+---------------+

·字符串参与运算前,被转换成整形('127'转换成127)

>select '127' | '128', '128' << 2, bit_count('15');

+---------------+------------+-----------------+

| '127' | '128' | '128' << 2 | bit_count('15') |

+---------------+------------+-----------------+

| 255 | 512 | 4 |

+---------------+------------+-----------------+

·十六进制字面值进行bit操作。mysql默认是将十六进制当做二进制字符串,但是在数字上下文中是将其当做数字

>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字符串格式:

UUID: 6ccd780c-baba-1026-9564-5b8c656024db

IPv6: fe80::219:d1ff:fe91:1a72

在text字符串格式上操作这些通常比较麻烦,通常是将其转换成固定长度的二进制字符串(不带分隔符)。

> 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操作:

> select x'40' | x'01', b'11110001' & b'01001111';

+---------------+---------------------------+

| x'40' | x'01' | b'11110001' & b'01001111' |

+---------------+---------------------------+

| 65 | 65 |

+---------------+---------------------------+

·由于_binary,会将十六进制字面值和bit字面值转成binary字符串:

> select _binary x'40' | x'01', b'11110001' & _binary b'01001111';

+-----------------------+-----------------------------------+

| _binary x'40' | x'01' | b'11110001' & _binary b'01001111' |

+-----------------------+-----------------------------------+

| A | A |

+-----------------------+-----------------------------------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值