11.1.4 十六进制字面量
十六进制字面值使用X'
或val
'0x
记法,其中val
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'
记法写的值必须包含偶数个数字或语法错误发生。要解决问题,可以在前面添加一个leading zero: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)
使用0x
记法写的值如果包含奇数个数字,则被视为具有额外的leading val
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 _utf8mb4 0x4D7953514C COLLATE utf8mb4_danish_ci;
示例使用了X'
记法,但val
'0x
记法也允许引入符号。关于引入符号的信息,请参见第12.3.8节,“Character Set Introducers”。val
在数字上下文中,MySQL将十六进制字面量视为BIGINT UNSIGNED
(64位无符号整数)。为了确保十六进制字面量的数字处理,请将其用于数字上下文。实现此目的的方法包括添加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'
记法基于标准SQL。val
'0x
记法基于ODBC,十六进制字符串常用于为BLOB
列提供值。
要将字符串或数字转换为十六进制格式,请使用HEX()
函数:
mysql> SELECT HEX('cat');
+------------+
| HEX('cat') |
+------------+
| 636174 |
+------------+
mysql> SELECT X'636174';
+-----------+
| X'636174' |
+-----------+
| cat |
+-----------+
对于十六进制字面量,位操作被认为是数字上下文,但MySQL 8.4 及更高版本允许位操作使用数字或二进制字符串参数。为了明确指定十六进制字面量的二进制字符串上下文,请将至少一个参数添加_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数字对numeric结果不进行显示。