11.1.4 Шестнадцатеричные литералы
Шестнадцатеричные литералы записываются с использованием обозначения X' или val'0x, где valval содержит шестнадцатеричные цифры (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, которые содержат нечетное число цифр, обрабатываются как имеющие дополнительный ведущий val0. Например, 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 обрабатывает шестнадцатеричный литерал как целое без знака 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' основано на стандарте SQL. Обозначение val'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.