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函数乱码问题的更多相关文章

  1. MS SQL Server的COALESCE函数

    MS SQL Server的COALESCE函数是从一系列表达式中返回第一个NOT NULL的值. 检查[B],[Q],[S],[T],[U]的值: 检查顺序[B]->[Q]->[S]-& ...

  2. MS SQL Server时间常用函数

    SQLServer时间日期函数详解,SQLServer,时间日期, 1.      当前系统日期.时间 select getdate() 2. dateadd      在向指定日期加上一段时间的基础 ...

  3. MS SQL Server字符拆分函数

    Insus.NET以前有用XQuery的nodes()方法写过一个函数,是MS SQL字符拆分的函数,http://www.cnblogs.com/insus/archive/2012/02/26/2 ...

  4. MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建

    前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...

  5. (转载)MS SQL Server 未公开的加密函数有哪些?

    MS SQL Server 未公开的加密函数有哪些? 以下的文章是对MS SQL Server 未公开的加密函数的具体操作,如果你对其相关的实际操作有兴趣的话,你就可以点击了. MS SQL Serv ...

  6. MS SQL Server的LTRIM,RTRIM和TRIM函数

    在MS SQL Server 2017有了一个新函数TRIM,整合以前版本LTRIM和RTRIM. 这几个函数都是去除字符串头部后尾部的空格. DECLARE @str NVARCHAR(MAX) = ...

  7. SQL Server 2005 MD5函数

    原文:SQL Server 2005 MD5函数 在SQL Server 2005下自带的函数HashBytes() ,此函数是微软在SQL Server 2005中提供的,可以用来计算一个字符串的M ...

  8. 【手记】小心在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这三个数,不可能返回其它 ...

  9. [MS SQL Server]SQL Server如何开启远程访问

    在日常工作中,经常需要连接到远程的MS SQL Server数据库中.当然也经常会出现下面的连接错误. 解决方法: 1. 设置数据库允许远程连接,数据库实例名-->右键--->属性---C ...

随机推荐

  1. 《Visual C++开发实战1200例 第1卷》扫描版[PDF]

    [内容简介:] <Visual C++开发实战1200例(第1卷)>是“软件开发实战1200例”丛书之一.<Visual C++开发实战1200例(第1卷)>,编程实例的四库全 ...

  2. asp.net后台解析JSON,并将值赋给对象

    示例代码如下: using System; using System.Collections.Generic; using System.Web.Script.Serialization; publi ...

  3. curl学习(实例不断总结)

    1.先来一个简单的案例,请求http协议的网站 // 初始化一个 cURL 对象 $curl = curl_init(); // 设置你需要抓取的URL curl_setopt($curl, CURL ...

  4. maven项目工程目录约定

    使用maven创建的工程我们称它为maven工程,maven工程具有一定的目录规范,如下: src/main/java —— 存放项目的.java文件 src/main/resources —— 存放 ...

  5. pthread_exit pthread_join

    int pthread_join(pthread_t thread, void **retval); int pthread_detach(pthread_t thread); void pthrea ...

  6. laravel在控制器中赋值给视图

    1.控制器 2.视图

  7. Mockplus 3.2前瞻,五大特色功能让你惊喜!

    在这个火热的夏季,我们有理由热切期待Mockplus 3.2的发布! 作为国产的一流原型设计工具,Mockplus 3.2版本会给我们带来什么呢? 格子(Repeater) 我们平常的设计,有大量需要 ...

  8. spring 3 mvc 的 @ResponseBody返回数据中文乱码

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter&q ...

  9. 【Maven】安装及配置(Linux)

    本文介绍Linux环境下安装Maven 安装环境和软件 系统:Linux(CentOS) 软件:apache-maven-3.3.9-bin.tar.gz(解压版). 安装步骤 maven是基于Jav ...

  10. python数据类型4

    一浮点数 什么叫做浮点数:浮点数就相当于小数,但是浮点数不包括无限循环又不重复的小数. 小数分为 有限小数和无限小数 无限小数又分为 无限循环小数和无限不循环小数 而 浮点数就是有限小数和无限循环小数 ...