数据库中电子邮件地址的最佳长度是多少?

时间:2009-07-29 10:10:43

标签: database performance email database-design

以下是我的查询的摘录部分,反映了EMAIL_ADDRESS列数据类型和属性:

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

但是,John Saunders使用VARYING(256)

这表明我没有必要正确理解VARYING。

据我所知,在我的情况下,电子邮件地址的长度为20个字符,而Jodn则为256个字符。

John的代码中的上下文

CREATE TABLE so."User"
  (
    USER_ID SERIAL NOT NULL,
    USER_NAME CHARACTER VARYING(50) NOT NULL,
    EMAIL_ADDRESS CHARACTER VARYING(256) NOT NULL, // Here
    HASHED_PASSWORD so.HashedPassword NOT NULL,
    OPEN_ID CHARACTER VARYING(512),                                                         
    A_MODERATOR BOOLEAN,
    LOGGED_IN BOOLEAN,
    HAS_BEEN_SENT_A_MODERATOR_MESSAGE BOOLEAN,
    CONSTRAINT User_PK PRIMARY KEY(USER_ID)
  );

我从未见过普通人使用的超过20个字符的电子邮件地址。

数据库中电子邮件地址的最佳长度是多少?

9 个答案:

答案 0 :(得分:121)

电子邮件地址的最大长度为254个字符。

每个电子邮件地址由两部分组成。 “@”符号前面的本地部分以及后面的域部分。在“user@example.com”中,本地部分是“user”,域部分是“example.com”。

本地部分不得超过64个字符,域部分不得超过255个字符。

电子邮件地址的本地+ @ +域部分的总长度不得超过254个字符。如RFC3696 Errata ID 1690中所述。

I got the original part of this information from here

答案 1 :(得分:55)

来自Ask Metafilter

  

我的数据来自323的数据库   地址。分布有一些   高端异常值   (正偏斜)。通常是这样的   没有异常值的分布式(I   测试了它。)

     

最小值:12第1四分位数:19平均值(w /   异常值):23.04平均值w / o异常值):   22.79第三四分位数:26最大值(带异常值):47最大值(不含异常值):35

     

中位数:23模式:24标准。开发(w /   异常值):5.20标准。开发(没有   异常值):4.70

     

基于数据的范围包括   离群   68.2%的数据17.8 - 28.2   95.4%的数据12.6 - 33.4   99.7%的数据7.4 - 38.6

     

根据数据异常值排除范围   68.1%的数据18.1 - 27.5   95.4%的数据13.4 - 32.2   99.7%的数据8.7 - 36.9

如果您注册http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/,那么您的电子邮件地址肯定会是异常值:)

这是Raycon的What is the maximum safe length of an email address to allow in a website form?,平均值略有不同(N = 50,496,平均值= 23):

Email address length distribution

答案 2 :(得分:17)

我的工作电子邮件地址超过20个字符!

阅读相应的RFC specification

  

“电子邮件地址的本地部分   最长可达64个字符   域名最多可以包含   255个字符“

答案 3 :(得分:14)

只需使用varchar(50)即可。每次都会发送更长的电子邮件。

看看50个字符有多长:

<强> peoplewithanemail @ ddressthislongjustuseashorterone

如果您允许255个字符的电子邮件:

  • 显示它们会弄乱你的用户界面(最多它们会被切断,最糟糕的是它们会推动你的容器和边缘)和
  • 恶意用户可以使用您无法预料的事情(例如黑客使用免费在线API存储大量数据的情况)

(统计显示,对于合法的电子邮件地址,实际上没有人输入超过50个字符,例如:Pageman的答案https://stackoverflow.com/a/1199245/87861

答案 4 :(得分:2)

正如其他人所说,方式大于20. 256 + 64对我来说听起来不错,并且符合RFC。

没有这么大的数据库值的唯一原因是,如果你担心性能或空间,如果你这样做,那么我99.99999999999999肯定是过早优化

去大。

答案 5 :(得分:2)

数据库中的变量字符类型不占用不需要的空间。因此,没有理由尽可能地限制这些领域。根据个人姓名,组织使用的命名方案及其域名,地址可以轻松超过20个字符。

RFC-2822中对local-part和domain-name的长度没有限制。 RFC-2181将域名限制为255个八位字节/字符。

同样,由于 varchar 仅使用您存储的字符串实际使用的空间,因此没有理由对电子邮件地址长度设置小的限制。只需要512,然后不要担心。其他一切都是premature optimization

答案 6 :(得分:2)

最初最多为320个字符(64 + 1 + 255,如其他答案中所示),但RFC 3696 Errata 1003表示:

  

然而,RFC 2821对于长度有限制   MAIL和RCPT命令中的地址为256个字符。自地址   那些不适合那些领域的人通常不是很有用的   通常应将地址长度限制视为256。

来自RFC 5321部分4.5.3.1.3

  

4.5.3.1.3。路径

     

反向路径或前向路径的最大总长度为256   八位字节(包括标点符号和元素分隔符)

这包括开始和结束括号,因此我们只允许 254个八位字节的电子邮件地址。

但请记住,八位字节的数量可能不等于字符数(char可能有2个或更多的八位字节)。此外,RFC section 4.5.3.1告诉可能存在多个字段,这些字段可能是最大的,但这是可行的,但不保证服务器能够正确捕获它们。

然后您可以/必须使用VARCHAR(254)来存储电子邮件地址。

注意:至少在MySQL中,声明为VARCHAR whit小于或等于255个八位字节的列将全部存储为1 byte + length(1用于存储长度),因此不会获得空间如果使用下限。

答案 7 :(得分:1)

无论是否全部使用,CHAR(20)字段总是占用20个字符。 (通常在末尾填充空格。)VARCHAR(20)字段将占用最多 20个字符,但可能占用更少。 CHAR()的常量宽度的一个好处是快速跳转到表中的一行,因为您可以只计算它必须在的索引。缺点是浪费空间。

如果表中有任何VARCHAR(x)列,则会丢失常量大小的CHAR(x)的好处。我似乎记得,如果某些列是VARCHAR(),MySQL会在后台静默地将任何CHAR()字段转换为VARCHAR()。

答案 8 :(得分:1)

TLDR 答案

使用 VARCHAR(256) 存储当前流行的 RFC Internet 标准中包含的 256 字符最大值。

来源

SMTP 最初定义了 RFC821 中的路径,该路径于 1982 年 8 月发布,即 an official Internet Standard(大多数 RFC 只是提案)。引用它...

<块引用>

...一个反向路径,指定邮件来自谁。

...一个转发路径,用于指定邮件的收件人。

RFC2821 于 2001 年 4 月发布,是过时的标准,它定义了我们当前本地部分、域和路径的最大值。 2008 年 10 月发布的新标准草案 RFC5321 保留了相同的限制。引用 RFC2821...

<块引用>

4.5.3.1.3。路径

反向路径或正向路径的最大总长度为 256 字符(包括标点符号和元素分隔符)。

常见错误答案

2004 年 2 月,发布了 RFC3696,它错误地将电子邮件地址的最大限制引用为 320 个字符。但这是一份“仅供参考”的文件,其中声明...

<块引用>

“本备忘录为 Internet 社区提供信息。它没有指定任何类型的 Internet 标准。”

我们可以忽略此限制,因为它是在 RFC5321 之前发布的,RFC5321 是 Internet 标准草案,将电子邮件地址的最大限制保持在 256 个字符不变。