Qual é o comprimento ideal para um endereço de e-mail em um banco de dados?

93

Aqui está uma parte extraída da minha consulta, refletindo o EMAIL_ADDRESStipo de dados da coluna e a propriedade:

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

No entanto, John Saunders usa VARYING(256).

Isso me sugere que não entendi necessariamente a VARIAÇÃO corretamente.

Eu entendo que o comprimento de um endereço de e-mail é de 20 caracteres no meu caso, enquanto no caso de Jodn 256 caracteres.

Contexto no código de 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)
  );

Nunca vi endereços de e-mail com mais de 20 caracteres, usados ​​por pessoas comuns.

Qual é o comprimento ideal para um endereço de e-mail em um banco de dados?

Léo Léopold Hertz 준영
fonte
O que você quer dizer com "ótimo"? O que você está tentando "otimizar"?
S.Lott
1
@ S.Lott: Eu quero construir um sistema seguro. O aumento da entrada do usuário aumenta o risco de executar códigos no banco de dados. --- Eu vejo a melhor forma de ter um sistema seguro.
Léo Léopold Hertz 준영
1
Bem, embora haja considerações de segurança em não fazer algo ilimitado, obedecer aos padrões sempre fará mais sentido. Seguir o que é "comum" ou "ótimo" provavelmente irá introduzir problemas de segurança e, em seguida, reduzi-los.
Kitson
1
Esta pergunta no StackOverflow sugere que o comprimento máximo agora é de 254 caracteres, incluindo o sinal "@": stackoverflow.com/questions/386294/…
dthrasher
1
Aqui está uma postagem relacionada sobre comprimento de e-mail de @DominicSayers, com uma resposta realmente completa: stackoverflow.com/a/574698/361842
JohnLBevan

Respostas:

134

O comprimento máximo de um endereço de e-mail é 254 caracteres.

Cada endereço de e-mail é composto de duas partes. A parte local que vem antes do sinal '@' e a parte do domínio que o segue. Em "usuá[email protected]", a parte local é "usuário" e a parte do domínio é "exemplo.com".

A parte local não deve exceder 64 caracteres e a parte do domínio não pode ter mais de 255 caracteres.

O comprimento combinado das partes locais + @ + do domínio de um endereço de e-mail não deve exceder 254 caracteres. Conforme descrito em RFC3696 Errata ID 1690 .

Eu peguei a parte original desta informação daqui

Iain Hoult
fonte
Parece que é melhor considerar 320 como o comprimento.
Léo Léopold Hertz 준영
40
Eu sei que este é um thread antigo e não há problema em usar 320, mas o máximo real é 254 por causa de uma restrição de substituição da RFC2821 que impõe restrições adicionais além daquelas citadas para as partes locais e de domínio. Se o espaço de armazenamento for um problema, pode valer a pena as pessoas saberem se eles tropeçarem neste tópico. Ver Errata ID 1690 na errata para RFC3696
HexAndBugs
Como @flightplanner disse, a Wikipedia resume essas seções aqui : "mas o máximo ... restringe o endereço de e-mail inteiro a não mais que 254 caracteres"
RustyTheBoyRobot
2
Especialmente se você deseja que o campo de e-mail tenha uma restrição exclusiva; sob INNODB e utf8 varchar (254) é pequeno o suficiente (menos de 767 bytes) para ter uma restrição única e varchar (300) não é.
Autonomy
Na errata ID 1003 do RFC 3696, descobri que 256 caracteres é o limite prático (e 320 caracteres é o máximo).
Arnold Schrijver
56

de Ask Metafilter :

Meus dados vêm de um banco de dados de 323 endereços. A distribuição tem alguns outliers de extremidade superior (enviesados ​​positivamente). É normalmente distribuído sem os outliers (eu testei).

Mín: 12 1º quartil: 19 Média (com outliers): 23,04 Média sem outliers): 22,79 3º quartil: 26 Máx (com outliers): 47 Máx (sem outliers): 35

Mediana: 23 Modo: 24 Padr. Dev (com outliers): 5,20 Std. Dev (sem outliers): 4,70

Intervalos com base em dados incluindo outliers 68,2% dos dados 17,8 - 28,2 95,4% dos dados 12,6 - 33,4 99,7% dos dados 7,4 - 38,6

Intervalos com base em dados discrepantes excluíram 68,2% dos dados 18,1 - 27,5 95,4% dos dados 13,4 - 32,2 99,7% dos dados 8,7 - 36,9

Se você se inscrever em http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/ , seu endereço de e-mail certamente seria um outlier :)

Aqui está Qual é a duração máxima de segurança de um endereço de e-mail para permitir de forma website? no Raycon com uma média ligeiramente diferente (N = 50.496, média = 23):

Distribuição de comprimento de endereço de e-mail

pajem
fonte
@Masi na verdade, o que é curioso é que é uma distribuição de Poisson em vez de uma distribuição normal - alguém tem ideia de por que é assim? : P
pageman
@pageman: A razão é que cada evento é distribuído aleatoriamente E cada evento é obtido do espaço infinito. - Você obtém uma distribuição semelhante se calcular o número de carros indo para o vermelho de forma que você tenha tempo vs. número de carros indo para o vermelho nos eixos.
Léo Léopold Hertz 준영
Pessoalmente, gosto mais da Lei de Benford: en.wikipedia.org/wiki/Benford%27s_law
Kitson
2
Usei 120 caracteres variáveis ​​por anos. A lógica do mundo real é que mesmo que alguém esteja pronto para preencher seu campo de 320 varchar ... Aposto que ele tem um e-mail alternativo de 40 caracteres
aguardando
17

Basta usar varchar(50). E-mails mais longos são uma porcaria, sempre.

Basta olhar quanto tempo 50 caracteres são:

peoplewithanemail @ ddressthislongjustuseashorterone

Se você permitir e-mails de 255 caracteres:

  • Exibi-los pode bagunçar sua IU (na melhor das hipóteses, eles serão cortados, na pior, eles empurram seus contêineres e margens) e
  • Usuários mal-intencionados podem fazer coisas com eles que você não pode prever (como aqueles casos em que os hackers usaram uma API online gratuita para armazenar um monte de dados)

(As estatísticas mostram que ninguém realmente insere mais do que cerca de 50 caracteres para um endereço de e-mail legítimo, consulte, por exemplo: a resposta do pageman https://stackoverflow.com/a/1199245/87861 )

Nicolas Manzini
fonte
5
Concordo plenamente. Quem em sã consciência ainda teria um endereço de e-mail? Claro, é teoricamente correto que um e-mail possa ter 320 caracteres, mas no mundo real? Em meus sistemas também uso varchar (50) e nunca tive uma reclamação de que um usuário não pode se registrar.
Norbert Norbertson
2
Seria interessante saber, a partir de enormes conjuntos de dados, qual é o comprimento médio do e-mail no mundo real, quais são os valores discrepantes e qual o tamanho.
Norbert Norbertson
4
Errado. Existem muitos usuários no mundo real que têm mais de 50 caracteres em seus emails e, mais importante, eles não podem alterá-los apenas para você. Recusar o acesso de algo que eles não podem consertar é injusto.
Marcus Downing
2
eles podem fazer novos e-mails, é claro que podem. faça do google um.
Nicolas Manzini de
Além disso, não se esqueça da notação de adição. Alguns usuários avançados estão usando isso para separar e organizar seus e-mails na caixa de entrada. Basicamente, eles terão um (sub) e-mail exclusivo para cada site / serviço / aplicativo. Por exemplo, vamos imaginar que meu e-mail normal seja meu nome e sobrenome em algum nome de empresa: [email protected]. Já são cerca de 40 caracteres. Agora, se eu usasse uma notação de adição para uma conta stackoverflow: [email protected]— isso dá aproximadamente 55 caracteres. Algumas notações positivas podem ser mais longas, por exemplo, + stackoverflow-personal e * -work.
Waterlink de
16

Meu endereço de e-mail comercial tem mais de 20 caracteres!

Leia a especificação RFC apropriada :

"A parte local de um endereço de e-mail pode ter até 64 caracteres e o nome de domínio pode ter no máximo 255 caracteres"

Dan Diplo
fonte
4

Os tipos de caracteres variáveis ​​em bancos de dados não ocupam espaço desnecessário. Portanto, não há razão para restringir esses campos tanto quanto possível. Dependendo do nome de uma pessoa, do esquema de nomenclatura usado por sua organização e de seu nome de domínio, um endereço pode facilmente exceder 20 caracteres.

Não há limite para o comprimento da parte local e do nome de domínio no RFC-2822 . A RFC-2181 limita o nome de domínio a 255 octetos / caracteres.

Novamente, como um varchar usa apenas o espaço realmente usado pela string que você armazena, não há razão para ter um pequeno limite para o comprimento do endereço de e-mail. Basta ir com 512 e parar de se preocupar. Todo o resto é otimização prematura

VoidPointer
fonte
3

Inicialmente, o máximo é de 320 caracteres (64 + 1 + 255, como mostrado em outras respostas), mas como RFC 3696 Errata 1003 disse:

No entanto, há uma restrição no RFC 2821 no comprimento de um endereço nos comandos MAIL e RCPT de 256 caracteres. Como os endereços que não se enquadram nesses campos normalmente não são úteis, o limite superior de comprimentos de endereço deve ser normalmente considerado como 256.

E da RFC 5321 seção 4.5.3.1.3 :

4.5.3.1.3. Caminho

O comprimento total máximo de um caminho reverso ou de avanço é de 256 octetos (incluindo a pontuação e os separadores de elemento)

Isso inclui os colchetes de abertura e fechamento, de modo que nos permita apenas 254 octetos de endereço de e-mail.

Mas lembre-se de que o número de octetos pode não ser igual ao número de caracteres (um caractere pode ter 2 ou mais octetos). Também a seção RFC 4.5.3.1 informa que pode haver campos de mais do que o máximo e isso é possível, mas não garantido aos servidores para capturá-los corretamente.

E então você pode / deve usar um VARCHAR(254)para armazenar um endereço de e-mail.

Nota: No MySQL, pelo menos, uma coluna declarada VARCHARcom menor ou igual a 255 octetos será toda armazenada como 1 byte + length(o 1 é para armazenar o comprimento), portanto, nenhum espaço é ganho se for usado um limite inferior.

PhoneixS
fonte
Você não explicou como passou de 256 bytes para 254. Sei que isso é o resultado dos colchetes de abertura / fechamento, mas você deve explicar isso como parte da resposta.
Gili
2

Como outros já disseram, muito maior do que 20. 256 + 64 parece bom para mim e é compatível com RFC.

A única razão para não ter um valor tão grande para o seu banco de dados é se você está se preocupando com desempenho ou espaço e, se estiver fazendo isso, tenho 99,999999999999999% de certeza de que é uma otimização prematura .

Cresça.

Stu Thompson
fonte
VARCHAR armazenou apenas o número de caracteres necessários (mais o comprimento). O único problema que vejo é se você está lutando por espaço no limite de 8.000 bytes por linha.
Richard Szalay
Não estou lutando por espaço. Estou lutando pelo equilíbrio entre segurança e usabilidade.
Léo Léopold Hertz 준영
2

Um campo CHAR (20) sempre ocupará 20 caracteres, quer você use todos ou não. (Muitas vezes preenchido com espaços no fim.) Um VARCHAR (20) campo vai ocupar até 20 caracteres, mas pode levar até menos. Um benefício da largura constante de CHAR () é o salto rápido para uma linha em uma tabela, porque você pode simplesmente calcular o índice em que ela deve estar. A desvantagem é perder espaço.

O benefício de CHAR (x) de tamanho constante é perdido se você tiver qualquer coluna VARCHAR (x) em sua tabela. Parece que me lembro que o MySQL silenciosamente converteu quaisquer campos CHAR () em VARCHAR () nos bastidores se algumas colunas fossem VARCHAR () s.


fonte