问题 用于SQL Server中电子邮件地址的NVARCHAR(?)


对于电子邮件地址,我应该为SQL Server中的列提供多少空间。

我在维基百科上找到了这个定义:

http://en.wikipedia.org/wiki/Email_address

电子邮件地址的格式是local-part @ domain,其中   local-part最长可达64个字符,域名可以   最多包含253个字符 - 但最多256个字符   正向或反向路径的长度限制整个电子邮件地址   不超过254个字符

和这个:

http://askville.amazon.com/maximum-length-allowed-email-address/AnswerViewer.do?requestId=1166932

因此,目前,电子邮件地址允许的总字符数为64(本地   部分)+ 1(“@”符号)+ 255(域部分)= 320

未来它们可能会增加局部限制   到128个字符。这将使总共384个字符。

有什么想法吗?


1818
2018-02-15 14:49


起源



答案:


我总是根据你后面的计算使用320。除非人们滥用它并在那里填充垃圾,否则它不会花费你任何东西来允许更多*。它 可以 让你少花钱,因为如果他们拥有合法的更长的电子邮件地址你会有一个令人沮丧的用户现在你将不得不返回并更新架构,代码,参数等。在我曾经使用过的系统中(一个电子邮件服务提供商),我遇到的最长的电子邮件地址自然是大约120个字符 - 显然他们只是为了咧嘴笑了一个长电子邮件地址。

* 不完全正确,因为内存授予估计是基于变宽列的半填充的假设,因此存储相同数据的更宽列可能导致某些查询的性能特征差异很大。

而且我一直在争论是否 NVARCHAR 是电子邮件地址所必需的。我还没有看到一个带有Unicode字符的电子邮件地址 - 我知道标准支持它们,但是现有的许多系统都没有,如果那是你的电子邮件地址,那将是非常令人沮丧的。

虽然这是真的 NVARCHAR 成本增加了一倍,使用SQL Server 2008 R2可以从Unicode压缩中受益,它基本上可以处理所有非Unicode字符 NVARCHAR 列为ASCII,因此您可以获得这些额外的字节。当然压缩仅适用于Enterprise + ...

减少空间需求的另一种方法是对所有观察到的域名使用中央查找表,并存储 LocalPart 和 DomainID 与用户,并存储每个唯一的域名只一次。是的,这使得编程更繁琐,但如果您有80,000个hotmail.com地址,则成本为80,0000 x 4字节而不是80,000 x 11字节(或压缩时更少)。如果存储或I / O是您的瓶颈,而不是CPU,这绝对是一个值得研究的选择。

我在这里写了这个:

http://www.mssqltips.com/sqlservertip/2657/storing-email-addresses-more-efficiently-in-sql-server/


14
2018-02-15 14:53



@tugberk抱歉通知延迟,但我在这里写到: mssqltips.com/sqlservertip/2657/... - Aaron Bertrand
仅供参考:ASP.NET成员资格提供程序使用“nvarchar(256)”为电子邮件字段创建数据库“AspNetUsers”。 - Yanga
@Yanga呃,谢谢你。 - Aaron Bertrand
Bertrand的另一个麦克风掉落。 - pimbrouwers


答案:


我总是根据你后面的计算使用320。除非人们滥用它并在那里填充垃圾,否则它不会花费你任何东西来允许更多*。它 可以 让你少花钱,因为如果他们拥有合法的更长的电子邮件地址你会有一个令人沮丧的用户现在你将不得不返回并更新架构,代码,参数等。在我曾经使用过的系统中(一个电子邮件服务提供商),我遇到的最长的电子邮件地址自然是大约120个字符 - 显然他们只是为了咧嘴笑了一个长电子邮件地址。

* 不完全正确,因为内存授予估计是基于变宽列的半填充的假设,因此存储相同数据的更宽列可能导致某些查询的性能特征差异很大。

而且我一直在争论是否 NVARCHAR 是电子邮件地址所必需的。我还没有看到一个带有Unicode字符的电子邮件地址 - 我知道标准支持它们,但是现有的许多系统都没有,如果那是你的电子邮件地址,那将是非常令人沮丧的。

虽然这是真的 NVARCHAR 成本增加了一倍,使用SQL Server 2008 R2可以从Unicode压缩中受益,它基本上可以处理所有非Unicode字符 NVARCHAR 列为ASCII,因此您可以获得这些额外的字节。当然压缩仅适用于Enterprise + ...

减少空间需求的另一种方法是对所有观察到的域名使用中央查找表,并存储 LocalPart 和 DomainID 与用户,并存储每个唯一的域名只一次。是的,这使得编程更繁琐,但如果您有80,000个hotmail.com地址,则成本为80,0000 x 4字节而不是80,000 x 11字节(或压缩时更少)。如果存储或I / O是您的瓶颈,而不是CPU,这绝对是一个值得研究的选择。

我在这里写了这个:

http://www.mssqltips.com/sqlservertip/2657/storing-email-addresses-more-efficiently-in-sql-server/


14
2018-02-15 14:53



@tugberk抱歉通知延迟,但我在这里写到: mssqltips.com/sqlservertip/2657/... - Aaron Bertrand
仅供参考:ASP.NET成员资格提供程序使用“nvarchar(256)”为电子邮件字段创建数据库“AspNetUsers”。 - Yanga
@Yanga呃,谢谢你。 - Aaron Bertrand
Bertrand的另一个麦克风掉落。 - pimbrouwers


我猜VARCHAR(320)将是基于ASCII的域名和电子邮件地址的正常限制。但我们不会开始看到unicode域名很快出现吗?

http://en.wikipedia.org/wiki/Internationalized_domain_name

也许NVARCHAR(320)是我们应该开始使用的?


0
2018-02-15 14:58



老实说,我相信这将是一个 长 在我们开始看到在域名和电子邮件地址中广泛采用Unicode字符之前的时间。只关注电子邮件服务器的数量只会对它们产生巨大影响...... - Aaron Bertrand
你是对的。如果我们关心这个长度,我们应该对unicode做同样的事情。 - tugberk