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

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

 EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

然而, 约翰·桑德斯使用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个字符的电子邮件地址,普通人使用。

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

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

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

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

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

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

来自Ask Metafilter :

我的数据来自323个地址的数据库。 分布有一些高端exception值(正偏态)。 它通常分布没有exception值(我testing了它)。

最小值:12第一四分位数:19平均值(w /离群值):23.04平均w / o离群值):22.79第三四等分:26最大值(离群值):47最大值

中位数:23模式:24标准 Dev(w / outliers):5.20标准 Dev(w / o outliers):4.70

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

排除基于数据exception值的范围68.2%的数据18.1 – 27.5 95.4%的数据13.4 – 32.2 99.7%的数据8.7 – 36.9

如果您注册http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/,那么你的电子邮件地址肯定是一个exception🙂

以下是在网站表单允许的电子邮件地址的最大安全长度是多less? Raycon的平均值略有不同(N = 50,496,平均值= 23):

电子邮件地址长度分布

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

阅读适当的RFC规范 :

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

只要使用varchar(50) 。 更长的电子邮件一直是垃圾。

看看50个字符多长时间:

peoplewithanemail @ ddressthislongjustuseashorterone

正如其他人所说,超过20的方式。256 + 64听起来不错,是符合RFC。

如果你担心性能或空间,如果你这样做,那么我99.99999999999999%肯定是不成熟的优化

去大。

数据库中的variables字符types不占用不必要的空间。 因此,没有理由尽可能地限制这些领域。 根据一个人的名字,他们组织使用的命名scheme和他们的域名,地址可以很容易地超过20个字符。

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

同样,由于varchar只使用您存储的string实际使用的空间,所以没有理由对电子邮件地址长度有一个小的限制。 只要512去,不要担心。 其他一切都是不成熟的优化

最初的最大值是320个字符(64 + 1 + 255,如其他答案所示),但是RFC 3696勘误表1003指出:

但是,RFC 2821中对MAIL和RCPT命令中的地址长度有256个字符的限制。 由于不适合这些字段的地址通常不会有用,所以地址长度的上限通常应该被认为是256。

并从RFC 5321第4.5.3.1.3节:

4.5.3.1.3。 path

反向path或前向path的最大总长度是256个八比特组(包括标点符号和元素分隔符)

这是包括开幕和结束括号,所以它让我们只有254个八位字节的电子邮件地址。

但是请记住,八位字节的数量可能不等于字符的数量(一个字符可能有两个或更多的八位字节)。 另外, RFC第4.5.3.1节也指出可以有更多的字段,这是可能的,但不能保证服务器正确地捕获它们。

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

注意:在MySQL中,至less一个声明为VARCHAR白色小于或等于255个八位字节的列将被存储为1 byte + length (1是存储长度),所以如果使用下限,则不会获得空间。

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

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