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

第二種是正確的
為什么呢?
因為
第一種數據類型默認的是 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(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區別
