Как конвертировать целое число в его двоичный эквивалент, например, BINARY (3) в MySQL - PullRequest
0 голосов
/ 29 октября 2019

Я выполняю операции хеширования, и мне нужно последовательно, точно, эффективно и т.д. добавлять необработанные байты.
Я не могу разбираться с ASCII-кодированными строками чисел, мне просто нужно получить необработанные байты.

Функции преобразования MySQL очень запутаны и не дают результатов, которые могут показаться очевидными для такого парня из SQL-Server, как я.

Например, BINARY 123456 создает строку в кодировке ASCIIс 6 символами, а не кажущейся очевидной BINARY ( 3 ) string 00000001 11100010 01000000 aka 0x01E240

Пока что единственный способ, которым я могу получить правильное преобразование, - это назначить шестнадцатеричный литерал - что, очевидно, нецелесообразново время выполнения.

SET @int_value = 123456 ;   -- Decimal value

SET @hex_value = 0x01E240 ; -- The same value, in hexadecimal,
                            -- 6 hex digits = 3 bytes

SELECT LENGTH ( BINARY @int_value ) , LENGTH ( BINARY @hex_value ) , LENGTH ( BINARY HEX ( @int_value ) ) ;

enter image description here

Так что в этом примере, как я могу преобразовать целочисленное значение (например, DECLARE 'целочисленная переменная или целое числостолбец) 123456 в строку из 3 байтов?

РЕДАКТИРОВАТЬ:
В соответствии с запросом в комментариях, SQL-Server по умолчанию выдает желаемые результаты:

enter image description here

ЭтоМне нужно подражать поведению в MySQL.

1 Ответ

3 голосов
/ 01 ноября 2019

Вы можете использовать HEX () для генерации строки с шестнадцатеричным представлением вашего целого числа. Затем UNHEX () преобразует эту строку в двоичное значение:

SET @int_value = 123456;   -- Decimal value

SET @bin_value = UNHEX(HEX(@int_value));

SELECT @int_value, HEX(@bin_value), LENGTH(@bin_value);

приводит к

@int_value | HEX(@bin_value) | LENGTH(@bin_value)
-----------|-----------------|-------------------
    123456 |          01E240 |                  3

См. Демонстрацию в db <> fiddle

...