解决MS SQL Server 使用HashBytes函数乱码问题
HASHBYTES 语法(参考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 的“二进制样式”部分。
Convert()函数是Sql Server2008及以上版本支持,2008以下版本可以使用下面的方法:
sys.fn_VarBinToHexStr() 或 sys.fn_sqlvarbasetostr() 函数转换也可以避免乱码,但是转换后的值带有0x开头,并且值为小写形式,如下:
SELECT master.dbo.fn_VarBinToHexStr(HASHBYTES('SHA1','m6go够123123')) --0xac5c5715768872b6152f723f503cc8e73169d6f5
SELECT master.dbo.fn_sqlvarbasetostr(HASHBYTES('SHA1','m6go够123123')) --0xac5c5715768872b6152f723f503cc8e73169d6f5
如果不需要开头的0x,使用substring()截取:
SELECT SUBSTRING(master.dbo.fn_VarBinToHexStr(HASHBYTES('SHA1','m6go够123123')),3,40) --ac5c5715768872b6152f723f503cc8e73169d6f5
SELECT SUBSTRING(master.dbo.fn_SqlVarBaseToStr(HASHBYTES('SHA1','m6go够123123')),3,40) --ac5c5715768872b6152f723f503cc8e73169d6f5
ps. SHA1算法结果为40位,MD5为32位或16位,根据实际长度截取。
也可使用 fn_varbintohexsubstring() :
SELECT master.dbo.fn_varbintohexsubstring(0,HASHBYTES('SHA1','m6go够123123'),1,0) --ac5c5715768872b6152f723f503cc8e73169d6f5
fn_SqlVarBaseToStr() 第1个参数表示是否保留0x前缀,1为保留,0为不保留。fn_VarBinToHexStr()内部调用的就是fn_SqlVarBaseToStr(),且第1个参数传的1。
参考:
http://stackoverflow.com/questions/2120/convert-hashbytes-to-varchar
解决MS SQL Server 使用HashBytes函数乱码问题的更多相关文章
- MS SQL Server的COALESCE函数
MS SQL Server的COALESCE函数是从一系列表达式中返回第一个NOT NULL的值. 检查[B],[Q],[S],[T],[U]的值: 检查顺序[B]->[Q]->[S]-& ...
- MS SQL Server时间常用函数
SQLServer时间日期函数详解,SQLServer,时间日期, 1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础 ...
- MS SQL Server字符拆分函数
Insus.NET以前有用XQuery的nodes()方法写过一个函数,是MS SQL字符拆分的函数,http://www.cnblogs.com/insus/archive/2012/02/26/2 ...
- MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建
前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...
- (转载)MS SQL Server 未公开的加密函数有哪些?
MS SQL Server 未公开的加密函数有哪些? 以下的文章是对MS SQL Server 未公开的加密函数的具体操作,如果你对其相关的实际操作有兴趣的话,你就可以点击了. MS SQL Serv ...
- MS SQL Server的LTRIM,RTRIM和TRIM函数
在MS SQL Server 2017有了一个新函数TRIM,整合以前版本LTRIM和RTRIM. 这几个函数都是去除字符串头部后尾部的空格. DECLARE @str NVARCHAR(MAX) = ...
- SQL Server 2005 MD5函数
原文:SQL Server 2005 MD5函数 在SQL Server 2005下自带的函数HashBytes() ,此函数是微软在SQL Server 2005中提供的,可以用来计算一个字符串的M ...
- 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
[手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...
- [MS SQL Server]SQL Server如何开启远程访问
在日常工作中,经常需要连接到远程的MS SQL Server数据库中.当然也经常会出现下面的连接错误. 解决方法: 1. 设置数据库允许远程连接,数据库实例名-->右键--->属性---C ...
随机推荐
- 《Visual C++开发实战1200例 第1卷》扫描版[PDF]
[内容简介:] <Visual C++开发实战1200例(第1卷)>是“软件开发实战1200例”丛书之一.<Visual C++开发实战1200例(第1卷)>,编程实例的四库全 ...
- 每月IT摘录201805
摘录自互联网的前辈心得: 一.技术:0.精通一个淘汰的技术对你没有任何价值.学习的精力有限,更应该花在值得学的技术上.比如网络.操作系统.数据结构.算法1.工作要有定力,更多的应该是关心问题如何更有效 ...
- 第八章 高级搜索树 (b3)B-树:查找
- SVN服务器端的安装和配置
第2章 SVN 的下载与安装 服务器端的安装和配置 所有的开发人员用自己的账号登录进来就可以拥有对仓库里面的所有文件的读和写的权限 创建用户
- Ubuntu dns
在Ubuntu系统网络设备启动的流程中,会依赖/etc/network/interface的配置文件初始化网络接口,所以直接在/etc/network/interface之中配置好对应的dns服务器会 ...
- SpringMVC入门(基于XML方式实现)
----------------------siwuxie095 SpringMVC 入门(基于 XML 方式实现) (一)搭建 SpringMVC 环境 1.先下载相关库文件,下载链接: (1)ht ...
- ios runtime简单实用(添加动态属性)
#import "Person.h" @interface Person (PersonCategory) // 添加Person中没有的name属性 @property (n ...
- 【校招面试 之 C/C++】第29题 C/C++ 关键字extern
1.extern "C" extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示 ...
- VC++ 定时器使用总结
VC++ WM_TIMER 定时器使用方法 在编程时,会经常使用到定时器.使用定时器的方法比较简单,通常告诉Windows一个时间间隔,然后WINDOWS以此时间间隔周期性触发程 ...
- B/S与C/S的比较
1.C/S需要安装客户端软件,比如我们的qq就是C/S模式下的软件.如果使用这些软件我们必须先要下载客户端软件.如果软件更新了,就需要下载新的客户端进行更新. 2.B/S无需安装客户端软件,比如我们的 ...