数据库问题sql server 获取MD5值 fn_sqlvarbasetostr 结果不一致的问题

Posted 多安分

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库问题sql server 获取MD5值 fn_sqlvarbasetostr 结果不一致的问题相关的知识,希望对你有一定的参考价值。

获取 111111 的MD5值

SELECT substring(sys.fn_sqlvarbasetostr(HashBytes(\'MD5\',\'111111\')),11,32)

执行结果:965eb72c92a549dd5a330112

 

但是计算方法放在 sql 里结果却是另一个

SELECT TOP 1 
[PwdSalt] + \'111111\'
,substring(sys.fn_sqlvarbasetostr(HashBytes(\'MD5\', PwdSalt + \'111111\')),11,32)
,substring(sys.fn_sqlvarbasetostr(HashBytes(\'MD5\', CONVERT(VARCHAR(150), (PwdSalt + \'111111\')))),11,32)
FROM [T_User_Info]

SELECT substring(sys.fn_sqlvarbasetostr(HashBytes(\'MD5\', \'c6b7574d61d14284b2157bf79183ed33111111\')),11,32)

 

要加密的字符串:c6b7574d61d14284b2157bf79183ed33111111

计算结果不同

第一种:5d26f71efb0442c84d66c312

第二种:3e585296d7f2d18d74cf2a24

 

 

而我们通过在线查询的结果:f915ab873e585296d7f2d18d74cf2a24

 https://md5jiami.51240.com/

 

第二种是正确的

为什么呢?

 

因为

第一种数据类型默认的是 nvarchar

第二种我们转成了 varchar 

 

一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar

varchar是实际内容的长度

而nvarchar占用的全部的存储

所以计算出的结果不同

 

数据库字段改成 varchar(50) 之后计算结果也一致了

 

参考下面的区别

 

sql server中的varchar和Nvarchar有什么区别?

 
答:
varchar(n)
长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。

nvarchar(n)
包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。

两字段分别有字段值:我和coffee
那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间。

如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar

 

摘自

varchar和Nvarchar区别

 

以上是关于数据库问题sql server 获取MD5值 fn_sqlvarbasetostr 结果不一致的问题的主要内容,如果未能解决你的问题,请参考以下文章

转:使用fn_dblog解析SQL SERVER 数据库日志方法

sql server 2012 - 无法授予对多语句表值函数的选择

sqlserver 怎么查看表的数据是加密的

SQL Server事务日志分析

sql server获取当前月的天数

SQL Server 内置函数实现MD5加密