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

111

这是我查询的一部分,反映了EMAIL_ADDRESS列的数据类型和属性:

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

然而,John Saunders 使用的是 VARYING(256)

这表明我可能没有正确理解 VARYING 的含义。

在我的情况下,我理解它表示电子邮件地址的长度为20个字符,而对于 John 而言是 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个字符的电子邮件地址。

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


“optimal”是什么意思?你想要“优化”什么? - S.Lott
1
@S.Lott:我想要构建一个安全的系统。用户输入的增加会增加他们在数据库中运行代码的风险。--- 我认为最优是拥有安全系统的最佳方式。 - Léo Léopold Hertz 준영
1
好的,尽管在不让某些东西无限制的情况下存在安全考虑,但遵循标准始终是最明智的选择。遵循“常规”或“最佳实践”可能会引入安全问题,然后再解决它们。 - Kitson
1
这个在StackOverflow上的问题表明,现在电子邮件地址的最大长度是254个字符,包括“@”符号:https://dev59.com/1HRC5IYBdhLWcg3wK92V - dthrasher
1
这里有一篇关于电子邮件长度的相关帖子,作者是@DominicSayers,他给出了非常详细的答案:https://dev59.com/1HRC5IYBdhLWcg3wK92V#574698 - JohnLBevan
显示剩余3条评论
9个回答

163
电子邮件地址的最大长度为254个字符。
每个电子邮件地址由两部分组成。在“@”符号之前的本地部分和在其后面的域部分。在“user@example.com”中,本地部分是“user”,域部分是“example.com”。
本地部分不能超过64个字符,域名部分不能超过255个字符。
电子邮件地址的本地部分+ @ +域名部分的组合长度不能超过254个字符。如RFC3696 Errata ID 1690所述。 我从这里获得了此信息的原始部分

1
似乎将长度设为320是最好的选择。 - Léo Léopold Hertz 준영
43
我知道这是一个旧的讨论串,使用320没有问题,但实际最大值是254,因为RFC2821有一个覆盖限制,对本地和域部分引用了额外的约束条件。如果存储空间是一个问题,对于那些遇到此线程的人们来说,了解这一点可能很有价值。请参见errata to RFC3696中的Errata ID 1690。 - HexAndBugs
正如@flightplanner所说,维基百科在这里总结了那些部分:“但是最大限制...限制整个电子邮件地址的长度不超过254个字符。” - RustyTheBoyRobot
2
特别是如果您希望电子邮件字段具有唯一约束条件;在INNODB和utf8 varchar(254)下,足够小(少于767字节)以具有唯一约束条件,而varchar(300)则不行。 - Autonomy
RFC 3696勘误ID 1003中,我发现它说256个字符是实际限制(而320个字符是最大限制)。 - Arnold Schrijver

59
Ask Metafilter得到以下数据:

我的数据来自一个包含323个地址的数据库。该分布有一些上限局外值(正偏斜)。如果不考虑这些局外值,它是正态分布的(我进行了测试)。

最小值:12 第一四分位数:19 平均值(含局外值):23.04 平均值(不含局外值):22.79 第三四分位数:26 最大值(含局外值):47 最大值(不含局外值):35

中位数:23 众数:24 标准差(含局外值):5.20 标准差(不含局外值):4.70

基于包含局外值的数据的范围 数据的68.2%:17.8 - 28.2 数据的95.4%:12.6 - 33.4 数据的99.7%:7.4 - 38.6

基于排除局外值的数据的范围 数据的68.2%: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):

电子邮件地址长度分布


@Masi 实际上有趣的是它是泊松分布而不是正态分布 - 有人有想法为什么会这样吗? :P - pageman
@pageman:原因是每个事件都是随机分布的,并且每个事件都来自无限空间。- 如果您计算开往红色的汽车数量,使得您在轴上拥有时间与开往红色的汽车数量,则会获得类似的分布。 - Léo Léopold Hertz 준영
个人而言,我更喜欢本福德定律:http://en.wikipedia.org/wiki/Benford%27s_law - Kitson
3
我已经使用了120个变量字符多年。现实世界的逻辑是,即使有人准备填写你的320 varchar字段...我敢打赌他们还有一个40个字符的备用电子邮件。 - Chukky Nze
链接http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/现在似乎是垃圾邮件-可能存在危险。不要点击。 - sommmen
假设有无限多(为了论据)超过323个有效域,并且在这些323个以上的有效域中有无限多个有效电子邮件地址,从a@开始,然后是aa@,然后是aaa@,依此类推... 323将对您的统计数据产生很大的抽样误差。 - gattsbr

28

只需要使用varchar(50)。较长的电子邮件很烦人,每次都是。

看看50个字符有多长:

peoplewithanemail@ddressthislongjustuseashorterone

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

  • 显示它们可能会破坏您的UI(最好的情况是它们被截断,最坏的情况是它们推动您的容器和边距)
  • 恶意用户可以做出您无法预料的行为(例如黑客使用免费在线API存储大量数据的情况)

(统计数据显示,没有人实际输入超过约50个字符的合法电子邮件地址,参见例如:pageman's answer https://dev59.com/uHM_5IYBdhLWcg3w2XHw#1199245


7
完全同意。有谁在理智的头脑中还会使用电子邮件地址呢?当然,从理论上讲,电子邮件可以有320个字符,但在现实世界中呢?在我的系统中,我也使用varchar(50),我从来没有收到过用户无法注册的投诉。 - Norbert Norbertson
2
从大量数据集中了解实际电子邮件长度的平均值以及离群值,以及它们的大小会非常有趣。 - Norbert Norbertson
9
错误。有很多真实世界的用户在他们的电子邮件中拥有超过50个字符,更重要的是,他们不能为了你而更改它。因为他们无法解决这个问题而拒绝给予他们访问是不公平的。 - Marcus Downing
2
他们当然可以创建新的电子邮件。创建一个谷歌邮箱吧。 - Nicolas Manzini
6
不要忘记加号符号的使用。一些高级用户在收件箱中使用它来区分和组织他们的电子邮件。基本上,他们将为每个网站/服务/应用程序创建一个独特的(子)电子邮件。例如,假设我的常规电子邮件是我的名字和姓氏@某个公司名称:firstnameandlastone@superacmecompany.com。这已经是约40个字符了。现在,如果我在stackoverflow账户中使用加号符号:firstnameandlastone+stackoverflow@superacmecompany.com,那就是约55个字符了。有些加号符号可能更长,例如+stackoverflow-personal和*-work。 - Waterlink

17

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

请阅读相应的RFC规范

"电子邮件地址的本地部分可以长达64个字符, 域名最多可以有255个字符"


5

数据库中的变量字符类型不会占用不必要的空间,因此没有理由尽可能地限制这些字段。根据人名、组织机构使用的命名方案和域名,一个地址很容易超过20个字符。

RFC-2822规定本地部分和域名的长度没有限制。 RFC-2181将域名长度限制为255个八位字节/字符。

同样,由于 varchar 只使用存储的字符串实际使用的空间,所以没有理由对电子邮件地址的长度进行小范围限制。只需使用512即可,无需再担心其他问题了。其他一切均为过早优化


3
最初的最大长度为320个字符(如其他答案中所示,64+1+255),但是如RFC 3696 Errata 1003所述:

然而,在RFC 2821中对MAIL和RCPT命令中地址长度的限制为256个字符。由于那些不适合这些字段的地址通常没有用处,因此通常应将地址长度上限视为256。

RFC 53214.5.3.1.3节得知:

4.5.3.1.3. 路径

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

这包括开放和关闭括号,因此它只允许我们使用254个八位字节的电子邮件地址。
但请注意,八位字节数量可能不等于字符数(一个字符可能有2个或更多的八位字节)。此外,RFC第4.5.3.1节表明可能有超过最大长度的字段,这是可能的,但服务器不能保证正确捕获它们。
然后,您可以/必须使用VARCHAR(254)来存储电子邮件地址。
注意:在MySQL中,如果将列声明为具有小于或等于255个八位字节的VARCHAR,则所有内容都将存储为1字节+长度(1用于存储长度),因此如果使用更低的限制,则不会获得空间优势。

你没有解释如何从256字节变成254字节。我知道这是由于开/闭括号的结果,但你应该将其作为答案的一部分进行解释。 - Gili

2

TLDR Answer

使用VARCHAR(256)存储当前普遍RFC互联网标准中的最大256个字符。

Source

SMTP最初在1982年8月发布的RFC821中定义了路径的含义,这是官方互联网标准(大多数RFC仅为建议)。引用它...

...反向路径,指定电子邮件发送者。

...正向路径,指定电子邮件接收者。

RFC2821于2001年4月发布,是废弃的标准,定义了我们现在的本地部分、域和路径的最大值。一个新的草案标准,RFC5321,于2008年10月发布,保持相同的限制。引用RFC2821...

4.5.3.1.3. Path

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

Common Mistaken Answers

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

“本备忘录为互联网社区提供信息。它不指定任何类型的互联网标准。”

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


1

正如其他人所说,比20大得多了。256 + 64 对我来说听起来不错,并且符合RFC。

如果你不想为你的数据库设置这么大的值,唯一的原因就是你担心性能或空间问题,如果你这样做,我99.99999999999999%确定这是“过早优化”。

要勇往直前。


VARCHAR 只存储所需的字符数(加上长度)。我唯一看到的问题是如果你在每行 8000 字节的限制中争夺空间。 - Richard Szalay
我不是在为空间而战,而是在为安全性和可用性之间的平衡而战。 - Léo Léopold Hertz 준영
当没有可用性时,安全性和可用性之间就不存在平衡。 - gattsbr

1

CHAR(20) 字段始终会占用 20 个字符的空间,无论你是否使用它。(通常在末尾填充空格。)VARCHAR(20) 字段最多占用 20 个字符的空间,但可能会占用更少。CHAR() 固定宽度的一个好处是能够快速跳转到表中的某一行,因为你可以计算出它必须在的索引。缺点是浪费空间。

如果表中有任何 VARCHAR(x) 列,那么固定大小的 CHAR(x) 的好处就会丧失。我记得 MySQL 在幕后会悄悄地将任何 CHAR() 字段转换为 VARCHAR(),如果一些列是 VARCHAR()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接