zoukankan      html  css  js  c++  java
  • 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                                 |
    +-----------------------+-----------------------------------+
    

      

  • 相关阅读:
    VUE body 背景色
    BUTTON莫名出现黄色边框 :focus
    VUE SVG
    【噶】字符串-680. 验证回文字符串 Ⅱ
    【噶】数组-两数之和(哈希表)
    【噶】数组-面试题 16.11. 跳水板
    【噶】字符串-58. 最后一个单词的长度
    Ajax_Jason 使用小Demo
    tomcat_部署项目以及相关问题
    js 表单的选择与反选简单操作
  • 原文地址:https://www.cnblogs.com/abclife/p/12617513.html
Copyright © 2011-2022 走看看