十六进制字面量使用 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'
符号表示的值必须包含偶数个数字,否则会发生语法错误。要解决此问题,请用前导零填充值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
符号表示的包含奇数个数字的值将被视为具有一个额外的前导 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 节,“字符集引入符”。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,在 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 位不会显示。