📜  MySQL |十六进制字面量

📅  最后修改于: 2022-05-13 01:54:35.321000             🧑  作者: Mango

MySQL |十六进制字面量

字面量:
它可以定义为赋予变量或常量的值。

例子:

int f = 2 

这里 f 是变量, 2 是数字字面量。

十六进制字面量:
这些是基数为 16 的整数(在编号系统中)。

例子:

int y = X'12A' 

十六进制字面量量前应加0x 或X,其值为12A,即相当于十进制数制中的298。

句法:
十六进制字面量值以下列形式编写:

X'val' 
x'val'
0xval  

val表示任何十六进制数,即范围 (0, 1, .....D, E, F) 中的任何数字。在 0xval 表示法中,0x 区分大小写,因此不能写为 0X'val'。但是,以 X 或 0x 开头的数字的字母大小写不区分大小写。

例子:
这些是有效的字面量。

X'015'
X'01aF'
x'BC'
x'2d'
0x7e4
0x88bA

这些是无效的字面量。

X'1s' // s is not in range (0, 1, ...A, .., F)
0X'1'  // OX is not a valid notation, 
       // correct notation is 0x 

注意:形式 X'val' 或 x'val' 的符号甚至不包含数字,否则将引发语法错误。

mysql>select X'3' 

错误 1064:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在“X”3 附近使用的正确语法。

通过在字符串的开头填充零,可以避免错误。

mysql> select X'03' 
               ->♥ 

如果以 0xval 形式写入的值包含奇数个数字,则将其视为在值的开头包含一个额外的前导零。就像,0x123 被视为 0x0123。

默认表示:
默认情况下,十六进制字面量是一个二进制字符串,其中每对代表一个字符。

例子:

mysql>select 0x65;
             -> e
mysql>select 5461626c65;
         -> Table
mysql>select 0x465;
         -> ♦e 

这里,在最后一个字面量量 0x465 中,输出是 '♦e',因为 65 代表字母 'e' 而 4 代表 ♦。

一个空的十六进制字面量值 (X' ') 是一个长度为零的二进制字符串。

mysql>select X'', length(X'')
       -> binary 0 

对十六进制字面量的操作——

  1. 整理操作:
    可以通过使用可选的字符集介绍器和COLLATE子句来更改十六进制字面量的默认字符集,以将其转换为特定字符集和排序规则的字符串。

    句法:

    [_charset_name] literal [COLLATE collation_name]

    例子:

    mysql>select _utf8 X'4745454B'
         -> GEEK
    mysql>select _utf8 X'4745454B' COLLATE utf8_danish_ci;
         -> GEEK
    
  2. BIT运营;
    mysql>select X'01' | X'02', hex(X'01' | X'02')
          -> 3 3
    mysql>select _binary X'01' | X'02', hex(_binary X'01' | X'02')
          -> ♥ 03 

    对于十六进制字面量,位操作会产生一个 BIGINT 值。与上面的代码一样,不使用 _binary 介绍器,不显示包含零的最高有效位。因此,通过使用 _binary 介绍器,我们可以在二进制上下文中明确指定它们。

  3. 算术运算:
    在数字上下文中,十六进制字面量被视为 BIGINT(64 位整数)。对于数值上下文,我们可以使用算术运算运算符,如 +、-、*、/、%;
    mysql>select 0x67+0
          -> 103
    mysql>select 0x45*2
          -> 138
    
  4. HEX() / UNHEX() 乐趣:
    我们可以使用内置函数HEX()将字符串或数字转换为十六进制字符串。
    mysql>select hex('e')
          -> 65
    mysql>select hex('table')
          -> 5461626C65
    

    同样, UNHEX()函数用于将每对十六进制数字转换为对应的字符。

    mysql>select unhex('5645')
           ->VE   
    mysql>select unhex('qq')
           ->NULL      
    

    在最后一个查询中,我们取消了非十六进制数字,即返回 NULL 的 ('qq')。