Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Hexadecimal Literals

11.1.4 十六进制字面值

十六进制字面值是使用 X'val'0xval 表示法编写的,其中 val 包含十六进制数字 (0..9A..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' 表示法编写的值必须包含偶数个数字,否则将出现语法错误。要纠正问题,请在值前添加一个leading零:

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 表示法编写的值,如果包含奇数个数字,将被视为具有额外的leading 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' 表示法,但 0xval 表示法也允许引入符。有关引入符的信息,请参见 第 12.3.8 节,“字符集引入符”

在数字上下文中,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'val' 表示法基于标准 SQL。0x 表示法基于 ODBC,对于十六进制字符串经常用于为 BLOB 列提供值。

要将字符串或数字转换为十六进制格式的字符串,请使用 HEX() 函数:

mysql> SELECT HEX('cat');
+------------+
| HEX('cat') |
+------------+
| 636174     |
+------------+
mysql> SELECT X'636174';
+-----------+
| X'636174' |
+-----------+
| cat       |
+-----------+

对于十六进制字面值,位操作被认为是数字上下文,但位操作允许数字或二进制字符串参数在 MySQL 8.3 及更高版本中。要明确指定二进制字符串上下文,请使用 _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     |
+----------+----------+

显示的结果对于两个位操作都相似,但结果没有 _binaryBIGINT 值,而结果带有 _binary 是二进制字符串。由于结果类型的差异,显示的值也不同:高位 0 数字不显示数字结果中。