首页 > 数据库技术 > 详细

解决MS SQL Server 使用HashBytes函数乱码问题

时间:2016-01-23 18:22:31      阅读:426      评论:0      收藏:0      [点我收藏+]

语法(参考MSDN):

HASHBYTES ( <algorithm>, { @input | input } ) 

<algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512 

作用:返回其在 SQL Server 中的输入的 MD2、MD4、MD5、SHA、SHA1 或 SHA2 哈希值。

 

T_User表中pwd列为varchar类型,执行sql:  

INSERT INTO T_User (pwd) VALUES(HASHBYTES(SHA1,m6go123123))

结果实际存进去的是乱码,如: ?硼{?鸇Sⅲ膙M9

这是由于 HASHBYTES 函数返回的是 varbinary 类型的数据,隐式转换为varchar类型后就出现了乱码。

解决1:设计pwd类型为varbinary,则存储的将是0x开头的十六进制的二进制类型;

解决2. 往往pwd列都设计为varchar类型,因此需要显式转换,如下:

INSERT INTO T_User (pwd_varchar) VALUES(CONVERT(VARCHAR(50),HASHBYTES(SHA1,m6go够123123),1))

这样存储的值就不是乱码,实际存储的值为: 0xAC5C5715768872B6152F723F503CC8E73169D6F5 

如果值不需要0x开头,可以设置 CONVERT() 的style参数为2,如下:

INSERT INTO T_User (pwd_varchar) VALUES(CONVERT(VARCHAR(50),HASHBYTES(SHA1,m6go够123123),2))

保存的值为: AC5C5715768872B6152F723F503CC8E73169D6F5

这里Convet函数的用法,参考 MSDN 的“二进制样式”部分。

 

网上其他方法,使用sys.fn_VarBinToHexStr() 或 sys.fn_sqlvarbasetostr() 函数转换也可以避免乱码,但是转换后的值带有0x开头,并且值为小写形式,如下:

INSERT INTO T_User (pwd_varchar) VALUES(master.dbo.fn_VarBinToHexStr(HASHBYTES(SHA1,m6go够123123)))
          
INSERT INTO T_User (pwd_varchar) VALUES(master.dbo.fn_sqlvarbasetostr(HASHBYTES(SHA1,m6go够123123)))

插入的值均为: 0xac5c5715768872b6152f723f503cc8e73169d6f5。

大家可以根据自己的需求选择。

 

解决MS SQL Server 使用HashBytes函数乱码问题

原文:http://www.cnblogs.com/songxingzheng/p/5153652.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!