### 9.1.4 十六进制文字

[](<>)[](<>)

十六进制文字值使用`X'*`值`*'`要么`0x*`值`*`符号，其中*`值`*包含十六进制数字 (`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'*`值`*'`表示法必须包含偶数位数，否则会出现语法错误。要更正此问题，请使用前导零填充该值：

```
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*`值`*`包含奇数位数的符号被视为具有额外的前导`0`.例如，`0xaa`被解释为`0x0aa`.

默认情况下，十六进制文字是二进制字符串，其中每对十六进制数字代表一个字符：

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

十六进制文字可能有一个可选的字符集介绍器和`整理`子句，将其指定为使用特定字符集和排序规则的字符串：

[](<>)[](<>)

```
[_charset_name] X'val' [COLLATE collation_name]
```

例子：

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

示例使用`X'*`值`*'`符号，但是`0x*`值`*`表示法也允许介绍人。有关介绍人的信息，请参阅[第 10.3.8 节，“字符集介绍器”](charset-introducer.html).

在数字上下文中，MySQL 将十六进制文字视为`BIGINT 未签名`（64 位无符号整数）。要确保对十六进制文字进行数字处理，请在数字上下文中使用它。执行此操作的方法包括添加 0 或使用[`CAST（...未签名）`](cast-functions.html#function_cast).例如，分配给用户定义变量的十六进制文字默认为二进制字符串。要将值分配为数字，请在数字上下文中使用它：

```
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。这`0x`表示法基于 ODBC，通常使用十六进制字符串来提供值[`斑点`](blob.html)列。

要将字符串或数字转换为十六进制格式的字符串，请使用[`十六进制（）`](string-functions.html#function_hex)功能：

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

[](<>)[](<>)

对于十六进制文字，位操作被视为数字上下文，但位操作在 MySQL 8.0 及更高版本中允许数字或二进制字符串参数。要为十六进制文字显式指定二进制字符串上下文，请使用`_二进制`至少一个论点的介绍人：

```
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     |
+----------+----------+
```

两种位操作的显示结果相似，但结果没有`_二进制`是一个`大整数`值，而结果与`_二进制`是一个二进制字符串。由于结果类型的不同，显示的值也不同：数值结果不显示高位 0 位。
