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
对十六进制字面量的操作——
- 整理操作:
可以通过使用可选的字符集介绍器和COLLATE子句来更改十六进制字面量的默认字符集,以将其转换为特定字符集和排序规则的字符串。句法:
[_charset_name] literal [COLLATE collation_name]
例子:
mysql>select _utf8 X'4745454B' -> GEEK mysql>select _utf8 X'4745454B' COLLATE utf8_danish_ci; -> GEEK
- 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 介绍器,我们可以在二进制上下文中明确指定它们。
- 算术运算:
在数字上下文中,十六进制字面量被视为 BIGINT(64 位整数)。对于数值上下文,我们可以使用算术运算运算符,如 +、-、*、/、%;mysql>select 0x67+0 -> 103 mysql>select 0x45*2 -> 138
- 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')。