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

MySQL的语言结构 - 字面量 - 位值字面量

数据库杂货铺 2021-05-09
352
位值字面量
 
位值字面量使用 b'val' 0bval 表示法。val 是用01组成的二进制值。前导字母 b 的大小写都可以接受。前导 0b 区分大小写,不能写成 0B
 
合法位值字面量:
 
    b'01'
    B'01'
    0b01
     
    非法位值字面量:
     
      b'2'    (2 is not a binary digit)
      0B01 (0B must be written as 0b)
       
      默认情况下,位值字面量是二进制字符串:
       
        mysql> SELECT b'1000001', CHARSET(b'1000001');
        +------------+---------------------+
        | b'1000001' | CHARSET(b'1000001') |
        +------------+---------------------+
        | A | binary |
        +------------+---------------------+
        mysql> SELECT 0b1100001, CHARSET(0b1100001);
        +-----------+--------------------+
        | 0b1100001 | CHARSET(0b1100001) |
        +-----------+--------------------+
        | a | binary |
        +-----------+--------------------+
         
        位值字面量可以有一个可选的指定字符集和 COLLATE 子句,将其指定为使用特定字符集和排序规则的字符串:
         
          [_charset_name] b'val' [COLLATE collation_name]
           
          示例:
           
            SELECT _latin1 b'1000001';
            SELECT _utf8 0b1000001 COLLATE utf8_danish_ci;
             
            示例使用 b'val' 表示法,但 0bval 表示法也指定字符集。
             
            在数字上下文中,MySQL 将位字面量视为整数。要确保对位字面量进行数字处理,请在数字上下文中使用它。方法包括添加0或使用 CAST(... AS UNSIGNED)。例如,默认情况下,分配给用户定义变量的位字面量是二进制字符串。要将值指定为数字,请在数字上下文中使用它:
             
              mysql> SET @v1 = b'1100001';
              mysql> SET @v2 = b'1100001'+0;
              mysql> SET @v3 = CAST(b'1100001' AS UNSIGNED);
              mysql> SELECT @v1, @v2, @v3;
              +------+------+------+
              | @v1 | @v2 | @v3 |
              +------+------+------+
              | a | 97 | 97 |
              +------+------+------+
               
              空位值 (b'') 的计算结果为零长度二进制字符串。转换为数字后,它将生成0:
               
                mysql> SELECT CHARSET(b''), LENGTH(b'');
                +--------------+-------------+
                | CHARSET(b'') | LENGTH(b'') |
                +--------------+-------------+
                | binary | 0 |
                +--------------+-------------+
                mysql> SELECT b''+0;
                +-------+
                | b''+0 |
                +-------+
                | 0 |
                +-------+
                 
                位值表示法便于指定要分配给 BIT 列的值:
                 
                  mysql> CREATE TABLE t (b BIT(8));
                  mysql> INSERT INTO t SET b = b'11111111';
                  mysql> INSERT INTO t SET b = b'1010';
                  mysql> INSERT INTO t SET b = b'0101';
                   
                  结果集中的位值作为二进制值返回,显示可能不友好。要将位值转换为可打印形式,请在数字上下文中使用它,或使用转换函数,例如 BIN() HEX()。转换后的值中不显示高阶0
                   
                    mysql> SELECT b+0, BIN(b), OCT(b), HEX(b) FROM t;
                    +------+----------+--------+--------+
                    | b+0 | BIN(b) | OCT(b) | HEX(b) |
                    +------+----------+--------+--------+
                    | 255 | 11111111 | 377 | FF |
                    | 10 | 1010 | 12 | A |
                    | 5 | 101 | 5 | 5 |
                    +------+----------+--------+--------+
                     
                    对于位字面量,位操作被认为是数字上下文,但在 MySQL 8.0 及更高版本中,位操作允许数字或二进制字符串参数。要显式指定位字面量的二进制字符串上下文,请对至少一个参数指定 _binary
                     
                      mysql> SET @v1 = b'000010101' | b'000101010';
                      mysql> SET @v2 = _binary b'000010101' | _binary b'000101010';
                      mysql> SELECT HEX(@v1), HEX(@v2);
                      +----------+----------+
                      | HEX(@v1) | HEX(@v2) |
                      +----------+----------+
                      | 3F | 003F |
                      +----------+----------+
                       
                      对于两个位操作,显示的结果似乎相似,但不带 _binary 的结果是 BIGINT 值,而带 _binary 的结果是二进制字符串。由于结果类型不同,显示的值也不同:数字结果不显示高位0
                       
                       
                       
                      官方网址:
                      https://dev.mysql.com/doc/refman/8.0/en/bit-value-literals.html
                      文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论