Sql 将电子邮件转换为MD5的Update语句未计算正确的结果

Sql 将电子邮件转换为MD5的Update语句未计算正确的结果,sql,sql-server-2008,Sql,Sql Server 2008,我试图循环浏览我的数据库和MD5散列我的电子邮件地址。这是我厌倦使用的代码: update Recipients set MD5Email = CONVERT(VARCHAR(MAX), HASHBYTES( 'md5', NonMd5.EmailAddress ), 2) from Recipients INNER JOIN Recipients as NonMd5 on Recipients.Id = NonMd5.Id 我也试过了,结果也一样: update Recipient

我试图循环浏览我的数据库和MD5散列我的电子邮件地址。这是我厌倦使用的代码:

update Recipients set MD5Email = CONVERT(VARCHAR(MAX), HASHBYTES( 'md5', NonMd5.EmailAddress ), 2)
from 
 Recipients INNER JOIN Recipients as NonMd5
on 
 Recipients.Id = NonMd5.Id 
我也试过了,结果也一样:

update Recipients set MD5Email = CONVERT(VARCHAR(MAX), HASHBYTES( 'md5', Recipients.EmailAddress ), 2)
    from 
     Recipients
如果我用硬编码字符串替换NonMd5.EmailAddress,它会正确计算。我不知道怎么了

这是我的桌子:

CREATE TABLE [dbo].[Recipients] (
[Id] uniqueidentifier NOT NULL DEFAULT (newid()) ,
[EmailAddress] nvarchar(MAX) COLLATE Latin1_General_CI_AS NULL ,
[IsProcessed] bit NOT NULL ,
[MD5Email] nvarchar(80) COLLATE Latin1_General_CI_AS NULL ,
CONSTRAINT [PK__Recipien__3214EC0703317E3D] PRIMARY KEY ([Id])
)
ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
GO
更新:

如果我将电子邮件地址设置为test@test.com这是我的结果:
4767DCA4A82B295C59D18097EE7B4070

在上面的代码中将其作为直接值运行,这是我的结果:

b642b4217b34b1e8d3bd915fc65c4452
那就:

UPDATE dbo.Recipients 
  SET MD5Email = CONVERT(NVARCHAR(80), HASHBYTES('MD5', EmailAddress), 2);
<>你说你真的应该考虑在MD5上的SHA或其他算法,并且你不应该把哈希输出存储为一个字符串-使用ValBoo.

以下是我得到的结果:

现在有一个非常重要的区别,我认为你错过了。您当前将电子邮件地址存储为
NVARCHAR(MAX)
——我不知道您为什么使用Unicode(世界上大多数服务器仍然不支持双字节字符),也不知道您为什么使用
MAX
。然而,比较这些:

SELECT CONVERT(NVARCHAR(80), HASHBYTES('MD5', 'test@test.com'), 2);

SELECT CONVERT(NVARCHAR(80), HASHBYTES('MD5', N'test@test.com'), 2);
----------- this N is very important ---------^

根据当前的SMTP标准,您的列可能应该是320个字符(域名255个字符,本地部分64个字符,加上@符号),而不是
MAX
(没有人的电子邮件地址超过4000个字符,更不用说10亿个字符了)。如果您真的需要支持Unicode电子邮件地址,那么您只需要
NVARCHAR
——正如我所说,现在大多数邮件服务器都无法识别Unicode电子邮件地址。如果更改数据类型,您将看到它与测试匹配。如果您继续使用
NVARCHAR
,则需要对每个苹果进行比较,因此在运行测试时,请确保在硬编码值前面加上
N

为什么MD5Email是NVARCHAR而不是varbinary?如果是nvarchar,为什么要将输出转换为varchar(max)?为什么要使用MD5而不是更强大的算法?为什么使用样式2而不是样式1?我同意,但是我们从客户那里得到了MD5加密电子邮件的列表,我们必须将这些列表与我们的列表进行比较。@DDiVita什么“结果”?请你再具体一点好吗?到目前为止,您所说的都是“不工作”-“不工作”是什么意思?@DDiVita您可以使用varbinary比较来比较传入的MD5值,就像字符串比较一样。看看你的小提琴,数值也不正确。这里有一个我创建的硬编码你的一个价值观:我理解这一点,但我仍然有价值观不正确的问题。