--MD5加密 --HashBytes ('加密方式', '待加密的值') --加密方式= MD2 | MD4 | MD5 | SHA | SHA1 --返回值類型:varbinary(maximum 8000 bytes) select HashBytes('MD5','123456') --HashBytes生成的結果為:0xE10ADC3949BA59ABBE56E057F20F883E --一般工具生成的都是沒有0x和是小寫的,16進制的數值,去掉“0x”轉換為小寫值就完全與MD5值吻合了, --在此需要用另一個函數(sys.fn_sqlvarbasetostr)把varbinary的值轉換為varchar類型的, select sys.fn_sqlvarbasetostr(HashBytes('MD5','123456')) --結果:0xe10adc3949ba59abbe56e057f20f883e 截取去掉0x select substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','123456')),3,32) --結果就是完整的MD5值:e10adc3949ba59abbe56e057f20f883e
在SQL Server 2005下自帶的函數HashBytes() ,此函數是微軟在SQL Server 2005中提供的,HashBytes() 函數的返回結果是VarBinary類型(以 0x 開頭 16 進制形式的二進制數據)。通常情況下,我們需要的都是字符串型的數據,直接存入varchar字段類型的列或者nvarchar的列,就會出現亂碼,需要類型轉化
--通用可以用convert替換sys.fn_sqlvarbasetostr select CONVERT(VARCHAR(50),HashBytes('MD5','123456'),1) --0xE10ADC3949BA59ABBE56E057F20F883E --如果值不需要0x開頭,可以設置 CONVERT() 的style參數為2 select CONVERT(VARCHAR(50),HashBytes('MD5','123456'),2) --Convert()函數是Sql Server2008及以上版本支持,2008以下版本可以使用下面的方法: --sys.fn_VarBinToHexStr() 或 sys.fn_sqlvarbasetostr() 函數轉換也可以避免亂碼,但是轉換后的值帶有0x開頭,並且值為小寫形式 select sys.fn_VarBinToHexStr(HashBytes('MD5','123456')) --ps. SHA1算法結果為40位,MD5為32位或16位,根據實際長度截取。 --也可使用 fn_varbintohexsubstring() : SELECT master.dbo.fn_varbintohexsubstring(0,HashBytes('MD5','123456'),1,0) --e10adc3949ba59abbe56e057f20f883e --fn_SqlVarBaseToStr() 第1個參數表示是否保留0x前綴,1為保留,0為不保留。fn_VarBinToHexStr()內部調用的就是fn_SqlVarBaseToStr(),且第1個參數傳的1。
--變量類型不同,得到的加密結果也不同 declare @a1 nvarchar(20) set @a1='123456' select HashBytes('MD5',@a1) --0xCE0BFD15059B68D67688884D7A3D3E8C declare @a2 nvarchar(10) set @a2='123456' select HashBytes('MD5',@a2) --0xCE0BFD15059B68D67688884D7A3D3E8C declare @a3 varchar(20) set @a3='123456' select HashBytes('MD5',@a3) --0xE10ADC3949BA59ABBE56E057F20F883E