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

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

数据库杂货铺 2021-07-25
780
MySQL 5.7 不兼容的位运算
 
因为位运算可以在 MySQL 8.0 中原生处理二进制字符串参数,所以有些表达式在 MySQL 8.0 中产生的结果与在 5.7 中不同。要注意的五种有问题的表达式类型是:
 
    nonliteral_binary { & | ^ } binary
    binary { & | ^ } nonliteral_binary
    nonliteral_binary { << >> } anything
    ~ nonliteral_binary
    AGGR_BIT_FUNC(nonliteral_binary)
     
    这些表达式在 MySQL 5.7 中返回 BIGINT,在 8.0 中返回二进制字符串。
     
    符号说明:
     
    ● { op1 op2 ... }: 应用于给定表达式类型的运算符列表。
     
    ● binary:任何类型的二进制字符串参数,包括十六进制字面量、位字面量或 NULL 字面量。
     
    ● nonliteral_binary:除了十六进制字面量、位字面量或 NULL 字面量的二进制字符串值的参数。
     
    ● AGGR_BIT_FUNC:接受位值参数的聚合函数:BIT_AND()BIT_OR()BIT_XOR()
     
    下面的列表描述了可用的位函数和运算符:
     
    ● |
     
    按位或。
     
    结果类型取决于参数是作为二进制字符串计算还是作为数字计算:
     
    ■ 当参数具有二进制字符串类型,且其中至少有一个不是十六进制字面值、位字面值或 NULL 字面值时,就会发生二进制字符串求值。数值计算则在其他情况下进行,必要时将参数转换为无符号64位整数。
     
    ■ 二进制字符串求值将生成与参数长度相同的二进制字符串。如果参数长度不相等,则会出现 ER_INVALID_BITWISE_OPERANDS_SIZE 错误。数值计算产生一个无符号64位整数。
     
      mysql> SELECT 29 | 15;
      -> 31
      mysql> SELECT _binary X'40404040' | X'01020304';
      -> 'ABCD'
       
      如果从 mysql 客户端调用按位或,二进制字符串结果将使用十六进制表示法显示,这取决于 --binary-as-hex 的值。
       
      ● &
       
      按位与。
       
      结果类型取决于参数是作为二进制字符串计算还是作为数字计算:
       
      ■ 当参数具有二进制字符串类型,且其中至少有一个不是十六进制字面值、位字面值或 NULL 字面值时,就会发生二进制字符串求值。否则进行数值计算,必要时将参数转换为无符号64位整数。
       
      ■ 二进制字符串求值将生成与参数长度相同的二进制字符串。如果参数长度不相等,则会出现 ER_INVALID_BITWISE_OPERANDS_SIZE 错误。数值计算产生一个无符号64位整数。
       
        mysql> SELECT 29 & 15;
        -> 13
        mysql> SELECT HEX(_binary X'FF' & b'11110000');
        -> 'F0'
         
        如果从 mysql 客户端中调用按位与运算,二进制字符串结果将使用十六进制表示法显示,这取决于 --binary-as-hex 的值。
         
        ● ^
         
        按位异或。
         
        结果类型取决于参数是作为二进制字符串计算还是作为数字计算:
         
        ■ 当参数具有二进制字符串类型,且其中至少有一个不是十六进制字面值、位字面值或 NULL 字面值时,就会发生二进制字符串求值。否则进行数值计算,必要时将参数转换为无符号64位整数。
         
        ■ 二进制字符串求值将生成与参数长度相同的二进制字符串。如果参数长度不相等,则会出现 ER_INVALID_BITWISE_OPERANDS_SIZE 错误。数值计算产生一个无符号64位整数。
         
          mysql> SELECT 1 ^ 1;
          -> 0
          mysql> SELECT 1 ^ 0;
          -> 1
          mysql> SELECT 11 ^ 3;
          -> 8
          mysql> SELECT HEX(_binary X'FEDC' ^ X'1111');
          -> 'EFCD'
          如果从 mysql 客户端中调用按位异或运算,二进制字符串结果将使用十六进制显示,这取决于 --binary-as-hex 的值。
           
          ● <<
           
          将一个 BIGINT 数或二进制字符串向左移位。
           
          结果类型取决于位参数是作为二进制字符串计算还是作为数字计算:
           
          ■ 当位参数具有二进制字符串类型且不是十六进制字面量、位字面量或 NULL 字面量时,就会进行二进制字符串求值。否则按照数值计算,必要时将参数转换为无符号64位整数。
           
          ■ 二进制字符串求值将生成与位参数长度相同的二进制字符串。数值计算产生一个无符号64位整数。
           
          无论参数类型如何,值末尾移位的位都会丢失,没有警告。特别地,如果移位计数大于或等于位参数中的位数,则结果中的所有位都为0
           
            mysql> SELECT 1 << 2;
            -> 4
            mysql> SELECT HEX(_binary X'00FF00FF00FF' << 8);
            -> 'FF00FF00FF00'
             
            如果从 mysql 客户端中调用位移位,则二进制字符串结果将使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。
             
            ● >>
             
            向右移动一个 BIGINT 数或二进制字符串。
             
            结果类型取决于位参数是作为二进制字符串计算还是作为数字计算:
             
            ■ 当位参数具有二进制字符串类型且不是十六进制字面量、位字面量或 NULL 字面量时,就会发生二进制字符串求值。否则进行数值计算,必要时将参数转换为无符号64位整数。
             
            ■ 二进制字符串求值将生成与位参数长度相同的二进制字符串。数值计算产生一个无符号64位整数。
             
            无论参数类型如何,值末尾移位的位都会丢失,没有警告。特别地,如果移位计数大于或等于位参数中的位数,则结果中的所有位都为0
             
              mysql> SELECT 4 >> 2;
              -> 1
              mysql> SELECT HEX(_binary X'00FF00FF00FF' >> 8);
              -> '0000FF00FF00'
               
              如果从 mysql 客户端调用位移运算,二进制字符串结果将使用十六进制表示法显示,这取决于 --binary-as-hex 的值。
               
              ● ~
               
              所有位取反。
               
              结果类型取决于位参数是作为二进制字符串计算还是作为数字计算:
               
              ■ 当位参数具有二进制字符串类型且不是十六进制字面量、位字面量或 NULL 字面量时,就会进行二进制字符串求值。否则进行数值计算,必要时将参数转换为无符号64位整数。
               
              ■ 二进制字符串求值将生成与位参数长度相同的二进制字符串。数值计算产生一个无符号64位整数。
               
                mysql> SELECT 5 & ~1;
                -> 4
                mysql> SELECT HEX(~X'0000FFFF1111EEEE');
                -> 'FFFF0000EEEE1111'
                 
                如果从 mysql 客户端中调用位取反,则二进制字符串结果将使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。
                 
                ● BIT_COUNT(N)
                 
                返回无符号64位整数参数 N 中二进制表示中设置为 1 的位数,如果参数为 NULL,则返回 NULL
                 
                  mysql> SELECT BIT_COUNT(64), BIT_COUNT(BINARY 64);
                  -> 1, 7
                  mysql> SELECT BIT_COUNT('64'), BIT_COUNT(_binary '64');
                  -> 1, 7
                  mysql> SELECT BIT_COUNT(X'40'), BIT_COUNT(_binary X'40');
                  -> 1, 1
                   
                   
                   
                   
                   
                   
                  官方网址:
                  https://dev.mysql.com/doc/refman/8.0/en/bit-functions.html
                  文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论