为什么 TSQL 将函数的结果以一种方式转换,而将字符串转换为另一种方式?

Why TSQL convert a function's result in one way and a character string to other way?

我在 SQL Server 2005 中尝试使用此命令从“123”获取 MD5:

select SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  '123' )), 3, 32) 

我得到了这个结果:

202cb962ac59075b964b07152d234b70

我想转换成二进制格式,

select 
   convert(varbinary(16), SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  '123')), 3, 32)) 

我得到了这个结果:

0x32003000320063006200390036003200

为什么这个代码:

select convert(varbinary(16), '202cb962ac59075b964b07152d234b70')

结果不同?

0x32303263623936326163353930373562

"Regular Character Type" 与 Unicode

这执行从 Nvarchar(Unicode) 到 Varbinary

的转换
select convert(varbinary(16),SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',  '123' )),3,32))

默认情况下,将文本放在单引号中使用常规字符类型,如 Char 或 Varchar。这执行从 Varchar("Regular Data Type") 到 Varbinary

的转换
select convert(varbinary(16),'202cb962ac59075b964b07152d234b70')

试试这个:

SELECT CONVERT(varbinary(16), N'202cb962ac59075b964b07152d234b70')

引号前的 "N" 将值定义为 Nvarchar(Unicode),您将获得所需的值

0x32003000320063006200390036003200

希望对您有所帮助!