暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 位函数和运算符(3)

数据库杂货铺 2021-07-23
566
按位 ANDOR XOR 运算
 
对于 &| ^ 位运算,结果类型取决于参数是二进制字符串还是数字:
 
● 当参数具有二进制字符串类型,且其中至少有一个不是十六进制字面量、位字面量或 NULL 字面量时,就会发生二进制字符串计算。否则将发生数值计算,必要时将参数转换为无符号64位整数。
 
● 二进制字符串计算产生一个与参数长度相同的二进制字符串。如果参数长度不相等,就会出现 ER_INVALID_BITWISE_OPERANDS_SIZE 错误。数值计算生成一个无符号64位整数。
 
数值计算示例:
 
    mysql> SELECT 64 | 1, X'40' | X'01';
    +--------+---------------+
    | 64 | 1 | X'40' | X'01' |
    +--------+---------------+
    | 65 | 65 |
    +--------+---------------+
     
    二进制字符串计算示例:
     
      mysql> SELECT _binary X'40' | X'01';
      +-----------------------+
      | _binary X'40' | X'01' |
      +-----------------------+
      | A |
      +-----------------------+
      mysql> SET @var1 = X'40', @var2 = X'01';
      mysql> SELECT @var1 | @var2;
      +---------------+
      | @var1 | @var2 |
      +---------------+
      | A |
      +---------------+
       
      按位补码和移位运算
       
      对于 ~<< >> 位运算,结果类型取决于位参数是作为二进制字符串还是数字计算的:
       
      ● 二进制字符串计算发生在位参数具有二进制字符串类型,且不是十六进制字面量、位字面量或 NULL 字面量时。否则将发生数值计算,必要时将参数转换为无符号64位整数。
       
      ● 二进制字符串计算产生一个与位参数长度相同的二进制字符串。数值计算生成一个无符号64位整数。
       
      对于移位运算,无论参数类型如何,移离值末端的位都将丢失而不发出警告。特别是,如果移位计数大于或等于位参数中的位数,则结果中的所有位数都为0
       
      数值计算示例:
       
        mysql> SELECT ~0, 64 << 2, X'40' << 2;
        +----------------------+---------+------------+
        | ~0 | 64 << 2 | X'40' << 2 |
        +----------------------+---------+------------+
        | 18446744073709551615 | 256 | 256 |
        +----------------------+---------+------------+
         
        二进制字符串求值示例:
         
          mysql> SELECT HEX(_binary X'1111000022220000' >> 16);
          +----------------------------------------+
          | HEX(_binary X'1111000022220000' >> 16) |
          +----------------------------------------+
          | 0000111100002222 |
          +----------------------------------------+
          mysql> SELECT HEX(_binary X'1111000022220000' << 16);
          +----------------------------------------+
          | HEX(_binary X'1111000022220000' << 16) |
          +----------------------------------------+
          | 0000222200000000 |
          +----------------------------------------+
          mysql> SET @var1 = X'F0F0F0F0';
          mysql> SELECT HEX(~@var1);
          +-------------+
          | HEX(~@var1) |
          +-------------+
          | 0F0F0F0F |
          +-------------+
           
          BIT_COUNT() 运算
           
          BIT_COUNT() 函数总是返回一个无符号的64位整数,如果参数为 NULL,则返回 NULL
           
            mysql> SELECT BIT_COUNT(127);
            +----------------+
            | BIT_COUNT(127) |
            +----------------+
            | 7 |
            +----------------+
            mysql> SELECT BIT_COUNT(b'010101'), BIT_COUNT(_binary b'010101');
            +----------------------+------------------------------+
            | BIT_COUNT(b'010101') | BIT_COUNT(_binary b'010101') |
            +----------------------+------------------------------+
            | 3 | 3 |
            +----------------------+------------------------------+
             
            BIT_AND()BIT_OR() BIT_XOR() 运算
             
            对于 BIT_AND()BIT_OR() BIT_XOR() 位函数,结果类型取决于函数参数值的计算方式是二进制字符串还是数字:
             
            ● 当参数值具有二进制字符串类型,且参数不是十六进制字面量、位字面量或 NULL 字面量时,就会发生二进制字符串计算。否则将发生数值计算,必要时将参数值转换为无符号64位整数。
             
            ● 二进制字符串计算产生一个与参数值长度相同的二进制字符串。如果参数值的长度不相等,就会出现 ER_INVALID_BITWISE_OPERANDS_SIZE 错误。如果参数大小超过511字节,就会出现 ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE 错误。数值计算生成一个无符号64位整数。
             
            NULL 值不会影响结果,除非所有值都是 NULL。在这种情况下,结果是一个与参数值的长度相同的中性值(对于 BIT_AND() 操作所有位为 1,对于 BIT_OR() BIT_XOR() 所有位为 0)
             
            例子:
             
              mysql> CREATE TABLE t (group_id INT, a VARBINARY(6));
              mysql> INSERT INTO t VALUES (1, NULL);
              mysql> INSERT INTO t VALUES (1, NULL);
              mysql> INSERT INTO t VALUES (2, NULL);
              mysql> INSERT INTO t VALUES (2, X'1234');
              mysql> INSERT INTO t VALUES (2, X'FF34');
              mysql> SELECT HEX(BIT_AND(a)), HEX(BIT_OR(a)), HEX(BIT_XOR(a))
              FROM t GROUP BY group_id;
              +-----------------+----------------+-----------------+
              | HEX(BIT_AND(a)) | HEX(BIT_OR(a)) | HEX(BIT_XOR(a)) |
              +-----------------+----------------+-----------------+
              | FFFFFFFFFFFF | 000000000000 | 000000000000 |
              | 1234 | FF34 | ED00 |
              +-----------------+----------------+-----------------+
               
              十六进制字面量、位字面量和 NULL 字面量的特殊处理
               
              为了向后兼容,当所有位参数都是十六进制字面量、位字面量或 NULL 字面量时,MySQL 8.0 会在数值上下文中计算位操作。也就是说,如果所有位参数都是未加修饰的十六进制字面量、位字面量或 NULL 字面量,则对二进制字符串位参数的位操作不使用二进制字符串求值(如果这些字面量带有 _binary 导入器、BINARY 运算符或其他显式指定为二进制字符串的方式编写的,则上述规则不适用于这些字面量。)
               
              刚才描述的字面量处理与 MySQL 8.0 之前的处理相同。示例:
               
              ● 这些位运算在数值上下文中计算字面量,并产生一个 BIGINT 结果:
               
                b'0001' | b'0010'
                X'0008' << 8
                 
                ● 这些位运算在数值上下文中计算 NULL,并产生一个具有 NULL 值的 BIGINT 类型结果:
                 
                  NULL & NULL
                  NULL >> 4
                   
                  MySQL 8.0 中,可以通过显式地指明至少一个参数是二进制字符串,使这些操作在二进制字符串上下文中计算参数:
                   
                    _binary b'0001' | b'0010'
                    _binary X'0008' << 8
                    BINARY NULL & NULL
                    BINARY NULL >> 4
                     
                    最后两个表达式的结果是 NULL,与没有 BINARY 运算符一样,但是结果的数据类型是二进制字符串类型而不是整数类型。
                     
                    官方网址:
                    https://dev.mysql.com/doc/refman/8.0/en/bit-functions.html
                    文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论