【数据库问题】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

摘自

原文地址:https://www.cnblogs.com/jhli/p/10062549.html

时间: 2024-08-01 00:14:07

【数据库问题】sql server 获取MD5值 fn_sqlvarbasetostr 结果不一致的问题的相关文章

sql server 获取每一个类别中值最大的一条数据

sql server 获取每一个类别中值最大的一条数据 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 /* 数据如下: name val memo a    2   a2(a的第二个值) a    1   a1--a的第一个值 a    3   a3:a的第三个值 b    1   b1--b的第一个

SQL Server 2005 MD5函数

原文:SQL Server 2005 MD5函数 在SQL Server 2005下自带的函数HashBytes() ,此函数是微软在SQL Server 2005中提供的,可以用来计算一个字符串的MD5和SHA1值,使用方法如下: --获取123456的MD5加密串 select hashbytes('MD5', '123456') ; --获取123456的SHA1加密串 select hashbytes('SHA1', '123456') ; 有了这个函数可以在SQL Server中为字符

SQL Server获取下一个编码字符实现继续重构与增强

我在SQL Server获取下一个编码字符实现的博文中,虽然实现了这个问题,但是感觉维护起来比较麻烦,例如如果调整编码字符串的固定长度,就需要变更三个函数,这样的为何成本确实比较大.面向对象编程很重视讲究开放封闭原则,我认为数据库对象特别函数.存储等对象也要尽量封装成实现单一功能,维护起来简单,也方便后续人员的维护,便利别人也是便利自己. 针对编码字符串的规则,继续延伸总结如下: 1.第一个字符必须是字母A-Z中任意一个字符,其长度可以为1位.2位.3位,……,6位.7位.8位.……: 2.编码

SQL Server获取下一个编码字符串的实现方案分割和进位

我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方案的,后一种方案虽然解决了其中方案的缺点,但是依然存在的编码字符串长度的限制(最多满足8位长度),本博文提供的方案将编码字符串长度增加到19位,也可以足够项目中实现这些编码. 具体的编码规则可以参看以上两种解决方案博文中的描述,也可以进入SQL Server 大V潇湘隐者的获取下一个编码字符串问题这篇博文.

SQL Server之 (一) 数据库简介 SQL Server环境配置 数据库基础知识

   前言 这个是我工作两年多后,再次从最基础的SQL入门开始,认真的学一遍SQL Server,捡漏和巩固都有;因为自己刚开始学的时候,总是心烦气躁,最近换工作,发现1到2年经验,问到基础性的东西还是很多,这个时候需要的是扎实的基础功夫,所以一系列打击+反省后,自己节假日在家从最基础重新认识一下SQL Server,继续沉淀一下.哪里有不对或需深入探讨,请直接留言或者小窗我;欢迎~ (一) 数据库简介   SQL Server环境配置   数据库基础知识 1.什么是数据库,数据库有哪些特点,为

在Windows Server 2008 R2 Server中,连接其他服务器的数据库遇到“未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker ”

项目代码和数据库部署在不同的Windows Server 2008 R2 Server中,错误日志显示如下: "未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数据库启用 Service Broker." SQL Server Service Broker介绍: SQL Server Service Broker 为消息和队列应用程序提供 SQL Server 数据库引擎本机支持.这使开发人员可以轻松地创建使用数据库

SQL Server获取索引创建时间&重建时间&重组时间

原文:SQL Server获取索引创建时间&重建时间&重组时间 之前写过一篇博客"SQL Server中是否可以准确获取最后一次索引重建的时间?",里面主要讲述了三个问题:我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild)的时间? 最后一次索引重组(INDEX REORGANIZE)的时间呢?,当时得出的结论,答案是我们无法准确的找到索引的创建时间.最后一次索引重组时间,最后一次索引重建的时间.但是最近看到一篇博客"SQL Server

未启用当前数据库的 SQL Server Service Broker,请为此数据库启用 Service Broker

未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数据库启用 Service Broker, 我执行了下面语句解决了问题 ALTER DATABASE [数据库名称] SET NEW_BROKER WITH ROLLBACK IMMEDIATE;ALTER DATABASE [数据库名称] SET ENABLE_BROKER; 未启用当前数据库的 SQL Server Service Broker,请为此数据库启用 Servic

SQL Server获取指定行的数据

SQL Server获取指定行(如第二行)的数据 --SQL Server获取指定行(如第二行)的数据-- --法一(对象法)-- select * from ( select * , number = row_number() over(order by Grade desc) from Students )  m where number = 2 --法二(排除法)--- select top 1 * from Students where Grade not in ( select top