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




performance email (6)

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

看看50个字符有多长:

peoplewithanemail @ ddressthislongjustuseashorterone

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

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

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

以下是我的查询的提取部分,反映了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个字符的电子邮件地址。

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


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

阅读相应的RFC规范

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


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

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


最初的最大值为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个八位字节的电子邮件地址。

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

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

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


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

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

大个子


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

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

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

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

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







database-design