2016-12-01 4 views
1

Когда я выполняю это жёстко, я получаю правильный результат:Непоследовательность конверсии SQL Server HASHBYTES?

Declare @result nvarchar(32) 

Set @result = convert(varchar(32), hashbytes('MD5', '1' + 'One' + 'Two' + 'Three'), 2) 

select @result 

Результат: 4173AB4C6EE66BC1FF7B7E5D44A872CA (правильный)

Но когда я звоню/выполнить эту хранимую процедуру, придавая ему те же параметры, это другой результат

ALTER Procedure [db_owner].[CheckTheTransaction] 
    @DataID nvarchar(50), 
    @Data1 nvarchar(50), 
    @Data2 nvarchar(50), 
    @Data3 nvarchar(50) 
as 
    Declare @result nvarchar(32) 
    Set @result = convert(varchar(32), hashbytes('MD5', @DataID + @Data1 + @Data2 + @Data3), 2) 

    Select @result 

Мой исполнение:

DECLARE @result int 

EXEC @result = [db_owner].[CheckTheTransaction] 
     @DataID = '1', 
     @Data1 = 'One', 
     @Data2 = 'Two', 
     @Data3 = 'Three' 

SELECT 'Result' = @result 

GO 

Результат: 5BD42777932EE959AD5A4C9FEE142F00 (неправильно)

Где я ошибся?

+0

Я предполагаю, что '' 1'' является VARCHAR и вы передаете NVARCHAR. Я готов поспорить, что оба значения правильные - только второй - UTF16. –

+0

Хотя ваша хеш-функция кажется вообще плохой, '@ Data1 = 'XX', @ Data2 = 'YY'' и' @ Data1 =' XXY ', @ Data2 =' Y'' вернет одно и то же значение хэш-функции. –

ответ

1

Изменить все NVARCHAR тип данных, как VARCHAR

ALTER Procedure [db_owner].[CheckTheTransaction] 
@DataID varchar(50), 
@Data1 varchar(50), 
@Data2 varchar(50), 
@Data3 varchar(50) 
as 
    Declare @result nvarchar(32) 
    Set @result = convert(varchar(32), hashbytes('MD5', @DataID + @Data1 +   
    @Data2 + @Data3), 2) 

Select @result 
+0

Это сработало, но теперь я не могу предоставить ему такие символы, как æøå, которые у меня есть – humudu

+0

Возможно, вы, вероятно, захотите кодировать текст UTF8. Символы ASCII = один байт, причудливые символы = более одного байта. На самом деле это довольно сложно в SQL Server. http://stackoverflow.com/questions/12512687/sql-server-utf8-howto –

2

Это проблема с типом данных. Вы увидите, что это соответствует изменению сценария T-SQ для последующих действий.

Объявите @result NVARCHAR (32)

Набор @result = новообращенный (VARCHAR (32), hashbytes ('MD5', N'1' + N'One '+ N'Two' + N'Three '), 2)

выберите @result

Смежные вопросы