Шестнадцатеричные литералы
Шестнадцатеричные литералы можно записать с помощью любого из следующих синтаксисов:
- x'
value' - X'
value' (стандарт SQL) - 0x
value(ODBC)
value представляет собой последовательность шестнадцатеричных цифр (от 0 до 9 и от A до F). Регистр цифр не имеет значения. В случае с двумя первыми синтаксисами value должно состоять из чётного числа цифр. В случае с последним синтаксисом, количество цифр может быть чётным, и они обрабатываются так, как будто у них есть дополнительный 0 в начале.
Обычно шестнадцатеричные литералы интерпретируются как двоичная строка, где каждая пара цифр представляет символ. При использовании в числовом контексте они интерпретируются как целые числа. (См. пример ниже). В ни каком случае шестнадцатеричный литерал не может быть десятичным числом.
Первые два синтаксиса; X'value' и x'value, следуют стандарту SQL и ведут себя как строка во всех контекстах в MariaDB начиная с MariaDB 10.0.3 и MariaDB 5.5.31 (исправляется MDEV-4489). Последний синтаксис, 0xvalue, является расширением MySQL/MariaDB для шестнадцатеричных гибридов и ведёт себя как строка или число в зависимости от контекста. MySQL обрабатывает все синтаксисы одинаково, поэтому могут быть разные результаты в MariaDB и MySQL (см. ниже).
Примеры
Представление символа a с использованием трёх вышеописанных синтаксисов:
SELECT x'61', X'61', 0x61; +-------+-------+------+ | x'61' | X'61' | 0x61 | +-------+-------+------+ | a | a | a | +-------+-------+------+
Шестнадцатеричные литералы в числовом контексте:
SELECT 0 + 0xF, -0xF; +---------+------+ | 0 + 0xF | -0xF | +---------+------+ | 15 | -15 | +---------+------+
Развлечения с типами
CREATE TABLE t1 (a INT, b VARCHAR(10)); INSERT INTO t1 VALUES (0x31, 0x61),(COALESCE(0x31), COALESCE(0x61)); SELECT * FROM t1; +------+------+ | a | b | +------+------+ | 49 | a | | 1 | a | +------+------+
Причина различных результатов выше в том, что когда 0x31 вставляется непосредственно в столбец, он обрабатывается как число, а когда 0x31 передаётся в COALESCE(), он обрабатывается как строка, потому что:
- Значения HEX по умолчанию имеют строковый тип данных.
- COALESCE() имеет тот же тип данных, что и аргумент.
Различия между MariaDB и MySQL
SELECT x'0a'+0; +---------+ | x'0a'+0 | +---------+ | 0 | +---------+ 1 row in set, 1 warning (0.00 sec) Warning (Code 1292): Truncated incorrect DOUBLE value: '\x0A' SELECT X'0a'+0; +---------+ | X'0a'+0 | +---------+ | 0 | +---------+ 1 row in set, 1 warning (0.00 sec) Warning (Code 1292): Truncated incorrect DOUBLE value: '\x0A' SELECT 0x0a+0; +--------+ | 0x0a+0 | +--------+ | 10 | +--------+
В MySQL (до версии MySQL 8.0.26):
SELECT x'0a'+0; +---------+ | x'0a'+0 | +---------+ | 10 | +---------+ SELECT X'0a'+0; +---------+ | X'0a'+0 | +---------+ | 10 | +---------+ SELECT 0x0a+0; +--------+ | 0x0a+0 | +--------+ | 10 | +--------+
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/hexadecimal-literals/