解決MS SQL Server 使用HashBytes函數亂碼問題


HASHBYTES 語法(參考MSDN):

HASHBYTES ( '<algorithm>', { @input | 'input' } ) 

<algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 

作用:返回其在 SQL Server 中的輸入的 MD2、MD4、MD5、SHA、SHA1 或 SHA2 哈希值。

 

T_User表中pwd列為varchar類型,執行sql:  

INSERT INTO T_User (pwd) VALUES(HASHBYTES('SHA1','m6go123123'))

結果實際存進去的是亂碼,如: ?硼{?鸇Sⅲ膙M9

這是由於 HASHBYTES 函數返回的是 varbinary 類型的數據,隱式轉換為varchar類型后就出現了亂碼。

解決1:設計pwd類型為varbinary,則存儲的將是0x開頭的十六進制的二進制類型;

解決2. 往往pwd列都設計為varchar類型,因此需要顯式轉換,如下:

INSERT INTO T_User (pwd_varchar) VALUES(CONVERT(VARCHAR(50),HASHBYTES('SHA1','m6go夠123123'),1))

這樣存儲的值就不是亂碼,實際存儲的值為: 0xAC5C5715768872B6152F723F503CC8E73169D6F5 

如果值不需要0x開頭,可以設置 CONVERT() 的style參數為2,如下:

INSERT INTO T_User (pwd_varchar) VALUES(CONVERT(VARCHAR(50),HASHBYTES('SHA1','m6go夠123123'),2))

保存的值為: AC5C5715768872B6152F723F503CC8E73169D6F5

這里Convet函數的用法,參考 MSDN 的“二進制樣式”部分。

 

Convert()函數是Sql Server2008及以上版本支持,2008以下版本可以使用下面的方法:

 

sys.fn_VarBinToHexStr() 或 sys.fn_sqlvarbasetostr() 函數轉換也可以避免亂碼,但是轉換后的值帶有0x開頭,並且值為小寫形式,如下:

SELECT master.dbo.fn_VarBinToHexStr(HASHBYTES('SHA1','m6go夠123123'))    --0xac5c5715768872b6152f723f503cc8e73169d6f5
          
SELECT master.dbo.fn_sqlvarbasetostr(HASHBYTES('SHA1','m6go夠123123'))    --0xac5c5715768872b6152f723f503cc8e73169d6f5

如果不需要開頭的0x,使用substring()截取:

SELECT SUBSTRING(master.dbo.fn_VarBinToHexStr(HASHBYTES('SHA1','m6go夠123123')),3,40)     --ac5c5715768872b6152f723f503cc8e73169d6f5

SELECT SUBSTRING(master.dbo.fn_SqlVarBaseToStr(HASHBYTES('SHA1','m6go夠123123')),3,40)    --ac5c5715768872b6152f723f503cc8e73169d6f5

ps. SHA1算法結果為40位,MD5為32位或16位,根據實際長度截取。

 也可使用 fn_varbintohexsubstring() :

SELECT master.dbo.fn_varbintohexsubstring(0,HASHBYTES('SHA1','m6go夠123123'),1,0)    --ac5c5715768872b6152f723f503cc8e73169d6f5

 fn_SqlVarBaseToStr() 第1個參數表示是否保留0x前綴,1為保留,0為不保留。fn_VarBinToHexStr()內部調用的就是fn_SqlVarBaseToStr(),且第1個參數傳的1。

參考:

http://stackoverflow.com/questions/2120/convert-hashbytes-to-varchar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM