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


93

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

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

但是,约翰·桑德斯John Saunders)使用VARYING(256)

这表明我不一定理解正确的变化。

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

约翰代码中的上下文

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个字符。

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


“最优”是什么意思?您正在尝试“优化”什么?
S.Lott

1
@ S.Lott:我想构建一个安全的系统。用户输入的增加会增加他们可以在数据库中运行代码的风险。---我认为最优是拥有安全系统的最佳方法。
莱奥波德·赫兹(LéoLéopoldHertz)2009年

1
好吧,尽管出于安全考虑,不要使某些事情变得无所不包,但严格遵守标准总是最有意义的。遵循“常见”或“最佳”的做法可能会引入安全问题,然后减少安全问题。
杰森

1
在计算器上这个问题表明,最大长度现在是254个字符,包括“@”符号:stackoverflow.com/questions/386294/...
dthrasher

1
这是来自@DominicSayers的有关电子邮件长度的相关文章,有一个非常详尽的答案:stackoverflow.com/a/574698/361842
JohnLBevan

Answers:


134

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

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

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

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

我从这里得到了这些信息的原始部分


看起来最好以320为长度。
莱奥波德·赫兹(LéoLéopoldHertz),2009年

40
我知道这是一个旧线程,使用320没问题,但是实际最大值是254,这是因为RFC2821的一个压倒性限制,在本地和域部分所引用的约束之外,还施加了其他约束。如果存储空间是一个问题,那么如果人们偶然发现此线程,那么可能值得知道。请参阅勘误表中的勘误ID 1690,以RFC3696
HexAndBugs 2012年

正如@flightplanner所说,Wikipedia 在此处总结了这些部分:“但最大数量...限制整个电子邮件地址不超过254个字符”
RustyTheBoyRobot 2012年

2
特别是如果您希望电子邮件字段具有唯一约束;在INNODB和utf8下,varchar(254)足够小(小于767bytes)以具有唯一约束,而varchar(300)则不是。
自治

RFC 3696勘误ID 1003中,我发现它表示实际限制为256个字符(最大为320个字符)。
Arnold Schrijver

56

来自Ask Metafilter

我的数据来自323个地址的数据库。该分布具有一些高端异常值(正偏)。它的分布通常没有异常值(我测试过)。

最小值:12第1个四分位数:19均值(不包含异常值):23.04均值(不包含离群值):22.79第3个四分位:26个最大值(不包含离群值):47最大值(不包含离群值):35

中位数:23模式:24标准。Dev(含离群值):5.20标准。Dev(不包含离群值):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上的平均值略有不同(N = 50,496,平均值= 23):

电子邮件地址长度分布


@Masi实际上很好奇的是,它是泊松分布而不是正态分布-有人知道为什么会这样吗?:P
Pageman

@pageman:原因是每个事件都是随机分布的,并且每个事件都是从无穷大空间中提取的。-如果您计算出向红色行驶的汽车数量,从而得出时间与轴上向红色行驶的汽车数量的关系,则得到的分布也类似。
莱奥波德·赫兹(LéoLéopoldHertz)2009年

我个人更喜欢本福德定律:en.wikipedia.org/wiki/Benford%27s_law
Kitson

2
我已经使用了120个可变字符多年。现实世界的逻辑是,即使有人准备填写您的320 varchar字段...我敢打赌,他们还有40字符替代电子邮件正待命
Chukky Nze 2014年

17

只需使用varchar(50)。每次都会浪费较长的电子邮件。

只要看看50个字符多长时间:

电邮至ddressthislongjustuseshorterone的人

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

  • 显示它们可能会使您的UI混乱(最好是将其截断,最坏的情况是它们会将您的容器和边距推到周围),并且
  • 恶意用户可以用您无法预料的方式对他们进行处理(例如黑客使用免费的在线API存储大量数据的情况)

(统计数据显示,没有人为合法电子邮件地址实际输入超过50个字符,请参见例如:pageman的回答https://stackoverflow.com/a/1199245/87861


5
完全同意。谁在他们的头脑中会再有一个电子邮件地址?当然,从理论上讲,电子邮件可以为320个字符,但在现实世界中是正确的吗?在我的系统中,我还使用varchar(50),而且我从未抱怨过用户无法注册。
诺伯特·诺伯森2016年

2
从庞大的数据集中知道现实世界中电子邮件的平均长度是多少,离群值是多少以及有多大将是很有趣的。
诺伯特·诺伯森2016年

4
错误。许多现实世界中的用户的电子邮件中包含超过50个字符,更重要的是,他们不能只为您更改它。拒绝他们无法解决的问题是不公平的。
Marcus Downing '18

2
他们当然可以制作新的电子邮件。使谷歌之一。
Nicolas Manzini

另外,请不要忘记加号。一些高级用户正在使用此功能在收件箱中隔离和整理电子邮件。从本质上讲,每个网站/服务/应用程序都会有一个唯一的(子)电子邮件。例如,假设我的普通电子邮件是我在某些公司名称上的名字和姓氏:firstnameandlastone@superacmecompany.com。已经有40个字符了。现在,如果我为stackoverflow帐户使用加号:firstnameandlastone+stackoverflow@superacmecompany.com-大约55个字符。一些加号可能更长一些,例如+ stackoverflow-personal和* -work。
水联线

16

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

阅读适当的RFC规范

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


4

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

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

同样,由于varchar仅使用您存储的字符串实际使用的空间,因此没有理由对电子邮件地址长度进行较小的限制。只需使用512并停止担心。其他一切都是过早的优化


3

最初的最大长度为320个字符(如其他答案所示,为64 + 1 + 255),但正如RFC 3696勘误表1003所述:

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

RFC 53214.5.3.1.3节开始:

4.5.3.1.3。路径

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

这包括左括号和右括号,因此它使我们仅保留254个八位位组的电子邮件地址。

但是请记住,八位位组的数量可能不等于字符数(一个char可能有2个或更多八位位组)。RFC 4.5.3.1节还指出,可能存在比最大值更多的字段,这是可能的,但不能保证服务器正确捕获它们。

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

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


您无法解释如何从256个字节增加到254个字节。我知道这是用方括号括起来的结果,但是您应该在答案中加以解释。
吉利2014年

2

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

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

大一点


VARCHAR仅存储所需的字符数(加上长度)。我看到的唯一问题是您是否正在为每行8000字节的限制争取空间。
理查德·萨雷

我不是在争取太空。我正在争取安全性和可用性之间的平衡。
莱奥波德·赫兹(LéoLéopoldHertz),2009年

2

不管您是否全部使用,CHAR(20)字段将始终占用20个字符。(通常在结尾处用空格填充。)VARCHAR(20)字段最多可包含 20个字符,但可以更少。CHAR()恒定宽度的一个好处是可以快速跳转到表中的一行,因为您可以只计算它必须位于的索引。缺点是浪费空间。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.