Преобразование HashBytes в VarChar
Я хочу получить хэш MD5 строкового значения 9X_sql-statement в SQL Server 2005. Я делаю это с помощью 9X_ms-sql-server следующей команды:
SELECT HashBytes('MD5', 'HelloWorld')
Однако это возвращает 9X_sql-statement значение VarBinary вместо значения VarChar. Если 9X_ms-sql-server я попытаюсь преобразовать 0x68E109F0F40CA72A15E05CC22786F8E6
в VarChar, я 9X_sqlselect получу há ðô§*à\Â'†øæ
вместо 68E109F0F40CA72A15E05CC22786F8E6
.
Есть ли решение на базе 9X_sql-srever SQL?
Ответ #1
Ответ на вопрос: Преобразование HashBytes в VarChar
Я нашел решение еще где:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
9X_select-statement
- fn_varbintohexstr - это недокументированная функция. Используйте CONVER ...
Ответ #2
Ответ на вопрос: Преобразование HashBytes в VarChar
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
9X_sql
- Где я могу прочитать об этих стилях преоб ...
Ответ #3
Ответ на вопрос: Преобразование HashBytes в VarChar
Используйте master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)
вместо master.dbo.fn_varbintohexstr
, а затем substringing
результат.
На 9X_sql самом деле fn_varbintohexstr
вызывает fn_varbintohexsubstring
внутри себя. Первый 9X_sql-statement аргумент fn_varbintohexsubstring
указывает ему добавлять 0xF
в качестве 9X_sql-select префикса или нет. fn_varbintohexstr
вызывает fn_varbintohexsubstring
с 1
в качестве 9X_sql-srever первого внутреннего аргумента.
Поскольку 9X_mssql вам не нужен 0xF
, вызывайте fn_varbintohexsubstring
напрямую.
Ответ #4
Ответ на вопрос: Преобразование HashBytes в VarChar
Вопреки тому, что говорит David Knight, эти две альтернативы 9X_sql возвращают одинаковый ответ в MS SQL 2008:
SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))
Похоже, что 9X_sql первый вариант лучше, начиная с версии 2008.
Ответ #5
Ответ на вопрос: Преобразование HashBytes в VarChar
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
(1 для преобразования шестнадцатеричного 9X_sql-server числа в строку)
преобразуйте это в меньшее 9X_sqlselect и удалите 0x из начала строки с помощью 9X_sql-srever подстроки:
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
точно так же, как то, что мы получаем 9X_sql-syntax в C# после преобразования байтов в строку
Ответ #6
Ответ на вопрос: Преобразование HashBytes в VarChar
Имея личный опыт использования следующего 9X_sql кода в хранимой процедуре, которая хеширует 9X_sqlselect переменную SP, я могу подтвердить, хотя 9X_mssql и недокументированная, эта комбинация работает 9X_sql на 100%, как в моем примере:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
-
8
-
23
-
16
-
13
-
6
-
8
-
7
-
8
-
10
-
10
-
7
-
9
-
4
-
8
-
13
-
15
-
16
-
11
-
8
-
6
-
4
-
6
-
3
-
10
-
3
-
5
-
4
-
18
-
33
-
6
-
18
-
21
-
4
-
10
-
13
-
42
-
6
-
10
-
18
-
4
-
11
-
11
-
6
-
15
-
13
-
40
-
7
-
13
-
7
-
3