2016-12-01 78 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)

select @result