• 【数据库问题】sql server 获取MD5值结果不一致的问题 substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','111111')),11,32)


    获取 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

    摘自

    varchar和Nvarchar区别

  • 相关阅读:
    利用SVN合并代码(merge)
    Swagger UI初识
    Jenkins详细教程
    Hangfire 分布式后端作业调度框架服务
    【转】Centos下MySQL使用总结
    MySQL基础
    IDE:IDEA Commit Changes Dialog local changes refresh
    JavaEE:JavaEE技术组成
    MyBatis-Exception:org.apache.ibatis.exceptions.PersistenceException
    JSON-fastjson
  • 原文地址:https://www.cnblogs.com/jhli/p/10062549.html
Copyright © 2020-2023  润新知