9.1.4 十六进制 Literals

十六进制 Literals 值使用X'val'0xvaltable 示法书写,其中* val *包含十六进制数字(0..9A..F)。数字的字母大小写和任何前导X都不重要。前导0x区分大小写,不能写为0X

合法的十六进制 Literals:

X'01AF'
X'01af'
x'01AF'
x'01af'
0x01AF
0x01af

非法的十六进制 Literals:

X'0G'   (G is not a hexadecimal digit)
0X01AF  (0X must be written as 0x)

使用X'val'table 示法编写的值必须包含偶数个数字,否则会发生语法错误。要解决此问题,请在值前加上零:

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)

使用0xvaltable 示法写入的包含奇数个数字的值将被视为具有额外的前导0。例如,0xaaa被解释为0x0aaa

默认情况下,十六进制 Literals 是二进制字符串,其中每对十六进制数字代 table 一个字符:

mysql> SELECT X'4D7953514C', CHARSET(X'4D7953514C');
+---------------+------------------------+
| X'4D7953514C' | CHARSET(X'4D7953514C') |
+---------------+------------------------+
| MySQL         | binary                 |
+---------------+------------------------+
mysql> SELECT 0x5461626c65, CHARSET(0x5461626c65);
+--------------+-----------------------+
| 0x5461626c65 | CHARSET(0x5461626c65) |
+--------------+-----------------------+
| Table        | binary                |
+--------------+-----------------------+

十六进制 Literals 可能具有可选的字符集介绍程序和COLLATE子句,以将其指定为使用特定字符集和排序规则的字符串:

[_charset_name] X'val' [COLLATE collation_name]

Examples:

SELECT _latin1 X'4D7953514C';
SELECT _utf8 0x4D7953514C COLLATE utf8_danish_ci;

这些示例使用X'val'table 示法,但是0xvaltable 示法也允许介绍者。有关介绍人的信息,请参见第 10.3.8 节“字符集介绍者”

在数字上下文中,MySQL 将十六进制 Literals 视为BIGINT(64 位整数)。为确保对十六进制 Literals 进行数字处理,请在数字上下文中使用它。这样做的方法包括加 0 或使用投射(...为未签名)。例如,默认情况下,分配给用户定义的变量的十六进制 Literals 是二进制字符串。要将值分配为数字,请在数字上下文中使用它:

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'table 示法基于标准 SQL。 0xtable 示法基于 ODBC,为此,十六进制字符串通常用于为BLOB列提供值。

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

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