深圳网络专科网站建设,自己做电影网站,中国免费图片素材网站,如何做网站本地服务器最近因为项目的需要#xff0c;报表中需要对数据进行MD5加密#xff0c;结果报表系统得出来的sql语句#xff0c;字符串前都自动带了N#xff0c;执行时#xff0c;发现得到的结果跟在数据库中执行的sql#xff08;字符串不带N#xff09;得的值不一样#xff0c;最后自…最近因为项目的需要报表中需要对数据进行MD5加密结果报表系统得出来的sql语句字符串前都自动带了N执行时发现得到的结果跟在数据库中执行的sql字符串不带N得的值不一样最后自己测试一下发现sql server执行md5加密的时候字符串前带N和不带N的结果确实是不一样的如下图
第2个值是自己想要的值为什么呢
因为表创建的时候字段用的字符类型时varchar而字符串加上N后数据类型默认为是 nvarchar了即加N后代表这个字符串是一个nvarchar类型在字符串前面加N可以把字符串转换为unicode编码每个字符串采用双字节的形式存储。所以字符串类型不一致导致加密得到的结果也不一致。
一般来说如果含有中文字符用nchar/nvarchar如果纯英文和数字用char/varcharvarchar是实际内容的长度而nvarchar占用的全部的存储所以计算出的结果不同 alter table table_name alter column name nvarchar(50);数据库字段改成 nvarchar(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×2610个字节的存储空间而nvarchar字段占8×216个字节的存储空间。
如字段值只是英文可选择varchar而字段值存在较多的双字节中文、韩文等字符时用nvarchar
在字符串前面加上 N 代表存入数据库时以 Unicode 格式存储。 N’string’ 表示string是个Unicode字符串.
Unicode 字符串的格式与普通字符串相似但它前面有一个 N 标识符N 代表 SQL-92 标准中的国际语言 (National Language)。N 前缀必须是大写字母。例如‘Michél’ 是字符串常量而 N’Michél’ 则是 Unicode 常量。Unicode 常量被解释为 Unicode 数据并且不使用代码页进行计算。Unicode 常量确实有排序规则主要用于控制比较和区分大小写。为 Unicode 常量指派当前数据库的默认排序规则除非使用 COLLATE 子句为其指定了排序规则。Unicode 数据中的每个字符都使用两个字节进行存储而字符数据中的每个字符则都使用一个字节进行存储。有关更多信息请参见使用 Unicode 数据。
我最终的解决方案是使用convert()函数把字符串前加N的转为varchar()字符类型如下图
sql语句
select upper(substring(sys.fn_sqlvarbasetostr(hashbytes(MD5,
(select N00000000000000000011 char(13) char(10)
N0001A110000000007LBY char(13) char(10)
N2022-12 char(13) char(10)
N750))),3,32)) as aunionselect upper(substring(sys.fn_sqlvarbasetostr(hashbytes(MD5,
(select 00000000000000000011 char(13) char(10)
0001A110000000007LBY char(13) char(10)
2022-12 char(13) char(10)
750))),3,32)) as a
union all
select upper(substring(sys.fn_sqlvarbasetostr(hashbytes(NMD5,(select convert(varchar(20), N00000000000000000011) char(13) char(10) convert(varchar(20), N0001A110000000007LBY) char(13) char(10) convert(varchar(20), N2022-12) char(13) char(10) convert(varchar(20), N750)))), 3, 32)) as a