Spec-Zone.ru › MySQL 8.4

11.1.4 Шестнадцатеричные литералы

Шестнадцатеричные литералы записываются с использованием обозначения X'val' или 0xval, где 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)

Значения, записанные с использованием обозначения 0xval, которые содержат нечетное число цифр, обрабатываются как имеющие дополнительный ведущий 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 обрабатывает шестнадцатеричный литерал как целое без знака 64-разрядное целое число (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.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 — двоичная строка. Из-за различий в типах результатов отображаемые значения различаются: ведущие нулевые цифры не отображаются для числового результата.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/hexadecimal-literals.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API