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

MySQL的语言结构 - 字面量 - 十六进制字面量

数据库杂货铺 2021-05-08
1091
十六进制字面量
 
十六进制字面量值使用 X'val' 0xval 形式表示,其中 val 包含十六进制数字(0..9, A..F)。数字和前导X的字母大小写不重要。但前导 0x 区分大小写,不能写成 0X
 
合法的十六进制字面量:
 
    X'01AF'
    X'01af'
    x'01AF'
    x'01af'
    0x01AF
    0x01af
    复制
     
    非法十六进制字面量:
     
      X'0G'   (G is not a hexadecimal digit)
      0X01AF (0X must be written as 0x)
      复制
       
      使用 X'val' 表示法编写的值必须包含偶数位数,否则会出现语法错误。要更正此问题,请用前导零填充该值:
       
        mysql> SET @s = X'FFF';
        ERROR 1064 (42000): You have an error in your SQL syntax;
        check the manual that corresponds to your MySQL server
        version for the right syntax to use near 'X'FFF''

        mysql> SET @s = X'0FFF';
        Query OK, 0 rows affected (0.00 sec)
        复制
         
        使用 0xval 表示法的包含奇数位数的值将被视为具有额外的前导0。例如,0xaaa 被解释为 0x0aaa
         
        默认情况下,十六进制字面量是二进制字符串,其中每对十六进制数字表示一个字符:
         
          mysql> SELECT X'4D7953514C', CHARSET(X'4D7953514C');
          +---------------+------------------------+
          | X'4D7953514C' | CHARSET(X'4D7953514C') |
          +---------------+------------------------+
          | MySQL | binary |
          +---------------+------------------------+
          mysql> SELECT 0x5461626c65, CHARSET(0x5461626c65);
          +--------------+-----------------------+
          | 0x5461626c65 | CHARSET(0x5461626c65) |
          +--------------+-----------------------+
          | Table | binary |
          +--------------+-----------------------+
          复制
           
          十六进制字面量可能有一个可选的字符集和 COLLATE 子句,将其指定为使用特定字符集和排序规则的字符串:
           
            [_charset_name] X'val' [COLLATE collation_name]
            复制
             
            示例:
             
              SELECT _latin1 X'4D7953514C';
              SELECT _utf8 0x4D7953514C COLLATE utf8_danish_ci;
              复制
               
              示例使用 X'val' 表示法,但是 0xval 表示法也允许指定字符集。
               
              在数字上下文中,MySQL 将十六进制字面量视为 BIGINT64位整数)。要确保十六进制字面量的数字处理,请在数字上下文中使用它。方法包括添加0或使用 CAST(... AS UNSIGNED)。例如,默认情况下,分配给用户定义变量的十六进制字面量是二进制字符串。要将值指定为数字,请在数字上下文中使用它:
               
                mysql> SET @v1 = X'41';
                mysql> SET @v2 = X'41'+0;
                mysql> SET @v3 = CAST(X'41' AS UNSIGNED);
                mysql> SELECT @v1, @v2, @v3;
                +------+------+------+
                | @v1 | @v2 | @v3 |
                +------+------+------+
                | A | 65 | 65 |
                +------+------+------+
                复制
                 
                空十六进制值(X'')的计算结果为零长度的二进制字符串。转换为数字后,它将生成0:
                 
                  mysql> SELECT CHARSET(X''), LENGTH(X'');
                  +--------------+-------------+
                  | CHARSET(X'') | LENGTH(X'') |
                  +--------------+-------------+
                  | binary | 0 |
                  +--------------+-------------+
                  mysql> SELECT X''+0;
                  +-------+
                  | X''+0 |
                  +-------+
                  | 0 |
                  +-------+
                  复制
                   
                  X'val' 表示法基于标准 SQL0x 表示法基于 ODBC,这种情况下十六进制字符串通常用于为 BLOB 列提供值。
                   
                  要将字符串或数字转换为十六进制格式的字符串,请使用 HEX() 函数:
                   
                    mysql> SELECT HEX('cat');
                    +------------+
                    | HEX('cat') |
                    +------------+
                    | 636174 |
                    +------------+
                    mysql> SELECT X'636174';
                    +-----------+
                    | X'636174' |
                    +-----------+
                    | cat |
                    +-----------+
                    复制
                     
                    对于十六进制字面量,位操作被认为是数字上下文,但在 MySQL 8.0 及更高版本中,位操作允许数字或二进制字符串作为参数。要为十六进制字面量显式指定二进制字符串上下文,请至少对一个参数使用 _binary
                     
                      mysql> SET @v1 = X'000D' | X'0BC0';
                      mysql> SET @v2 = _binary X'000D' | X'0BC0';
                      mysql> SELECT HEX(@v1), HEX(@v2);
                      +----------+----------+
                      | HEX(@v1) | HEX(@v2) |
                      +----------+----------+
                      | BCD | 0BCD |
                      +----------+----------+
                      复制
                       
                      对于两个位操作,显示的结果似乎相似,但不带 _binary 的结果是 BIGINT 值,而带 _binary 的结果是二进制字符串。由于结果类型不同,显示的值也不同:数字结果不显示高位数字0
                       
                       
                       
                       
                      官方网址:
                      https://dev.mysql.com/doc/refman/8.0/en/hexadecimal-literals.html
                       
                      文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论