以下是我的查询的摘录部分,反映了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个字符的电子邮件地址。
数据库中电子邮件地址的最佳长度是多少?
答案 0 :(得分:121)
电子邮件地址的最大长度为254个字符。
每个电子邮件地址由两部分组成。 “@”符号前面的本地部分以及后面的域部分。在“user@example.com”中,本地部分是“user”,域部分是“example.com”。
本地部分不得超过64个字符,域部分不得超过255个字符。
电子邮件地址的本地+ @ +域部分的总长度不得超过254个字符。如RFC3696 Errata ID 1690中所述。
答案 1 :(得分:55)
我的数据来自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):
答案 2 :(得分:17)
答案 3 :(得分:14)
只需使用varchar(50)
即可。每次都会发送更长的电子邮件。
看看50个字符有多长:
<强> peoplewithanemail @ ddressthislongjustuseashorterone 强>
如果您允许255个字符的电子邮件:
(统计显示,对于合法的电子邮件地址,实际上没有人输入超过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。
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)
使用 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
个字符不变。