标签:select 一个 lan wds 选择 bst char sel 不一致
获取 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
第二种是正确的
为什么呢?
因为
第一种数据类型默认的是 nvarchar
第二种我们转成了 varchar
一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar
varchar是实际内容的长度
而nvarchar占用的全部的存储
所以计算出的结果不同
数据库字段改成 varchar(50) 之后计算结果也一致了
参考下面的区别
sql server中的varchar和Nvarchar有什么区别?
摘自
【数据库问题】sql server 获取MD5值 fn_sqlvarbasetostr 结果不一致的问题
标签:select 一个 lan wds 选择 bst char sel 不一致
原文地址:https://www.cnblogs.com/jhli/p/10062549.html