Преобразование двоичного столбца в строку в хранилище данных SQL Azure

В настоящее время у меня есть функции в Postgres и Redshift, которые берут случайно сгенерированную строку, хешируют ее, а затем используют часть хеша для генерации случайного числа от 0 до 99. Я пытаюсь воспроизвести эту функциональность в хранилище данных SQL Azure, чтобы получить в SQL DW то же значение, что и в Postgres и Redshift.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я передаю результат в VARCHAR или использую строковую функцию, результатом является совсем другая строка. Я бы хотел получить результат функции md5 как идентичный VARCHAR.

Для иллюстрации вот запрос в Azure SQL DW:

SELECT
  'abc123' as random_string,
  HASHBYTES('md5', 'abc123') as md5,
  CAST(HASHBYTES('md5', 'abc123') AS VARCHAR) as md5_varchar,
  RIGHT(HASHBYTES('md5', 'abc123'), 5) as md5_right
;

Это дает

random_string,md5,md5_varchar
abc123,0xE99A18C428CB38D5F260853678922E03,éšÄ(Ë8Õò`…6x’.,6x’.

Как видите, результирующий varchar сильно отличается от вывода функции md5. Есть ли способ преобразовать результат md5 в идентичную строку?

В Postgres и Redshift результатом функции md5 является VARCHAR, поэтому выполнять преобразования с ним просто.

Вот запросы в Redshift и Postgres:

-- Redshift
SELECT
  'abc123' as random_string,
  right(strtol(right(md5('abc123'), 3), 16), 2)::INT as tranche
;

-- Postgres
SELECT
  'abc123' as random_string,
  right(('x' || lpad(right(md5('abc123'), 3), 4, '0')) :: BIT(16) :: INT :: VARCHAR, 2) :: INT AS tranche
;

Обе функции возвращают значение 87.


person Erik Shilts    schedule 11.11.2017    source источник


Ответы (1)


Использование convert должно решить эту проблему:

CONVERT(VARCHAR(32),HashBytes('MD5', 'abc123'),2)

Это потому, что вы можете определить параметр для стиля, который необходим при преобразовании значения varbinary. Это описано здесь: https://technet.microsoft.com/pl-pl/library/ms187928(v=sql.105).aspx

Вот часть замечаний из этой документации о двоичном преобразовании с помощью convert:

Двоичные стили Если выражение является двоичным (n), varbinary (n), char (n) или varchar (n), style может быть одним из значений, показанных в следующей таблице. Значения стиля, не указанные в таблице, возвращают ошибку.

0 (по умолчанию)

Преобразует символы ASCII в двоичные байты или двоичные байты в символы ASCII. Каждый символ или байт преобразуется 1: 1. Если data_type является двоичным типом, символы 0x добавляются слева от результата.

1, 2

Если data_type является двоичным типом, выражение должно быть символьным выражением. Выражение должно состоять из четного числа шестнадцатеричных цифр (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, a, b, c , г, д, е). Если для стиля установлено значение 1, символы 0x должны быть первыми двумя символами в выражении. Если выражение содержит нечетное количество символов или если какой-либо из символов недопустим, возникает ошибка. Если длина преобразованного выражения больше, чем длина data_type, результат будет усечен справа. Типы данных фиксированной длины, которые больше, чем у преобразованного результата, будут иметь нули, добавленные справа от результата. Если data_type является символьным типом, выражение должно быть двоичным выражением. Каждый двоичный символ преобразуется в два шестнадцатеричных символа. Если длина преобразованного выражения больше, чем длина data_type, оно будет усечено справа. Если data_type является символьным типом фиксированного размера, а длина преобразованного результата меньше его длины data_type; справа от преобразованного выражения добавляются пробелы, чтобы сохранить четное число шестнадцатеричных цифр. Символы 0x будут добавлены слева от результата преобразования для стиля 1.

person shimon893    schedule 11.11.2017