
[英]How to convert from Hashbytes function's SHA2_256 encryption datatype to varchar(256) in SQL Server 2012
[英]Convert HashBytes to VarChar
我想在SQL Server 2005中获取字符串值的MD5哈希值。我使用以下命令执行此操作:
SELECT HashBytes('MD5', 'HelloWorld')
但是,这会返回VarBinary而不是VarChar值。 如果我尝试将0x68E109F0F40CA72A15E05CC22786F8E6
转换为VarChar,我会得到há ðô§*à\\Â'†øæ
而不是68E109F0F40CA72A15E05CC22786F8E6
。
有没有基于SQL的解决方案?
我找到了其他解决方案:
SELECT SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', 'HelloWorld')), 3, 32)
SELECT CONVERT(NVARCHAR(32),HashBytes('MD5', 'Hello World'),2)
使用master.dbo.fn_varbintohexsubstring(0, HashBytes('SHA1', @input), 1, 0)
代替master.dbo.fn_varbintohexstr
,然后对结果进行substringing
。
实际上fn_varbintohexstr
在内部调用fn_varbintohexsubstring
。 fn_varbintohexsubstring
的第一个参数告诉它添加0xF
作为前缀。 fn_varbintohexstr
调用fn_varbintohexsubstring
其中1
为第一个参数internaly。
因为您不需要0xF
, fn_varbintohexsubstring
直接调用fn_varbintohexsubstring
。
与David Knight所说的相反,这两个替代方案在MS SQL 2008中返回相同的响应:
SELECT CONVERT(VARCHAR(32),HashBytes('MD5', 'Hello World'),2)
SELECT UPPER(master.dbo.fn_varbintohexsubstring(0, HashBytes('MD5', 'Hello World'), 1, 0))
所以看起来第一个是从2008版开始的更好的选择。
convert(varchar(34), HASHBYTES('MD5','Hello World'),1)
(1用于将十六进制转换为字符串)
将其转换为更低并通过子串从字符串的开头删除0x:
substring(lower(convert(varchar(34), HASHBYTES('MD5','Hello World'),1)),3,32)
与将字节转换为字符串后在C#中得到的完全相同
根据使用以下代码在散列SP变量的存储过程中的个人经验我可以确认,虽然没有记录,但这个组合按照我的例子100%工作:
@var=SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA2_512', @SPvar)), 3, 128)
将数据类型更改为varbinary似乎对我来说效果最好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.