假设我有一个具有以下列的数据库表:
蛋白质序列
id (Integer)
AASequence (nvarchar(max))
还假设该表只有一个条目
当我对其执行以下查询时:
SELECT TOP 1
AASequence,
LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', AASequence), 2)) AS noconvertvarcharmd5,
LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(VARCHAR, UPPER(AASequence))), 2)) AS uppermd5,
FROM
[EOI].[dbo].[ProteinSequence]
WHERE
AASequence = 'PLEINEQMMDLHSSLRTWCYFCYNAALHVPGNLTTQLMAKAMEPNAINIHCSEPTDYQQQGRSAASEWGLGIWQIVNLCHMCLGLYACVKTGSFNGCDGGGFQGIWCCWGSFTDYSLDDALGEKWCKEMRPYAHQINDVLIDMPLEFQHDSSIQWPQKACDNNQSTMTFWLAEKIFTFFQGLKQMDSTFQDNCPHATQNQKAMQVRAGSRATEAYCINTSDFMCLSKKWMAACKTKIVDGFQFSQFCWSNMDWATVYICANLTNWFYTGATSSKLVDQVWRESIVGQMFTHLYCPNVCIVPEYCEEMCFNRSQAQCMSADMCSLRSKQCTTELFCYICAGFLGGNVAWNGQRWWETDMYIEYWLIWTLQWHCNKHMHGCSTESRMHEYDDQQILELKNIHVWPFPGYEEYYTECRPEEMTVMQHTASMGSEAHNDLKNAWILDGSDMIADIWEVNICESQPQWWVNEWGKYLCSHKHDGLIDE';
我在SQL Server 2017中获得不同的哈希编码,具体取决于我是否转换输入序列。这是结果
无转换:76EFBE0427AA717507930168758C664D
进行转换:85B592208DA2D9A2415420009FE56CEB
我还发现,这种差异也不会在非常短的字符串上发生。
有人可以帮助我理解为什么会发生这种情况吗?
上下文:在代码审查期间确定了此行为,以寻找原因的原因,原因是我们在数据库中有重复的条目。注意:我们正在使用MD5校验和确定一串字母的独特性。
CONVERT(varchar,upper(AASequence))
截断为30个字符,您需要明确提供类型长度,例如 CONVERT(varchar(500),upper(AASequence))
参考:
- https://learn.microsoft.com/en-us/sql/t-sql/data-types/char-and-varchar-varchar-transact-sql?view=sql-server-server-2017
sqlfiddle:http://sqlfiddle.com/#!18/b4c4b/5
以下函数调用会产生不同的明文。
AASequence
CONVERT(varchar,upper(AASequence)))
不同的明文在=不同的哈希。
让aasequence =快速的棕狐跳过了懒狗。
然后,上(aasequence(=快速的棕狐跳过了懒狗。