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 обрабатывает шестнадцатеричный литерал как 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' основано на стандартном SQL. Обозначение val'0x основано на ODBC, для которого шестнадцатеричные строки часто используются для предоставления значений для BLOB столбцов.
Для преобразования строки или числа в строку в шестнадцатеричном формате используйте функцию HEX():
mysql> SELECT HEX('cat');
+------------+
| HEX('cat') |
+------------+
| 636174 |
+------------+
mysql> SELECT X'636174';
+-----------+
| X'636174' |
+-----------+
| cat |
+-----------+
Для шестнадцатеричных литералов операции по битам считаются числовым контекстом, но операции по битам допускают числовые или двоичные строковые аргументы в MySQL 9.2 и выше. Чтобы явно указать контекст двоичной строки для шестнадцатеричных литералов, используйте вводной фрагмент _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.