--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