¿Cuál es la longitud óptima para una dirección de correo electrónico en una base de datos?


95

Aquí hay una parte extraída de mi consulta, que refleja la EMAIL_ADDRESSpropiedad y el tipo de datos de la columna:

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

Sin embargo, John Saunders usa VARYING(256).

Esto me sugiere que no necesariamente he entendido la VARIACIÓN correctamente.

Entiendo que la longitud de una dirección de correo electrónico es 20 caracteres en mi caso, mientras que 256 para Jodn.

Contexto en el 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 he visto direcciones de correo electrónico de más de 20 caracteres, utilizadas por personas comunes.

¿Cuál es la longitud óptima para una dirección de correo electrónico en una base de datos?


¿Qué quiere decir con "óptimo"? ¿Qué estás intentando "optimizar"?
S.Lott

1
@ S.Lott: Quiero construir un sistema seguro. El aumento en la entrada del usuario aumenta el riesgo de que puedan ejecutar códigos en la base de datos. --- Veo lo óptimo como la mejor manera de tener un sistema seguro.
Léo Léopold Hertz 준영

1
Bueno, si bien existen consideraciones de seguridad para no hacer algo ilimitado, cumplir con los estándares siempre tendrá más sentido. Seguir lo que es "común" u "óptimo" probablemente introducirá problemas de seguridad y luego los reducirá.
Kitson

1
Esta pregunta en StackOverflow sugiere que la longitud máxima ahora es de 254 caracteres, incluido el signo "@": stackoverflow.com/questions/386294/…
dthrasher

1
Aquí hay una publicación relacionada sobre la longitud del correo electrónico de @DominicSayers, con una respuesta realmente completa: stackoverflow.com/a/574698/361842
JohnLBevan

Respuestas:


135

La longitud máxima de una dirección de correo electrónico es de 254 caracteres.

Cada dirección de correo electrónico se compone de dos partes. La parte local que viene antes del signo '@' y la parte de dominio que le sigue. En "usuario@example.com", la parte local es "usuario" y la parte de dominio es "ejemplo.com".

La parte local no debe exceder los 64 caracteres y la parte del dominio no puede tener más de 255 caracteres.

La longitud combinada de las partes del dominio local + @ + de una dirección de correo electrónico no debe exceder los 254 caracteres. Como se describe en RFC3696 Errata ID 1690 .

Obtuve la parte original de esta información de aquí.


Parece que lo mejor es tomar 320 como longitud.
Léo Léopold Hertz 준영

40
Sé que este es un hilo antiguo y no hay problema para usar 320, pero el máximo real es 254 debido a una restricción predominante de RFC2821 que impone restricciones adicionales además de las citadas para las partes local y de dominio. Si el espacio de almacenamiento es un problema, puede valer la pena que la gente lo sepa si se encuentran con este hilo. Ver Errata ID 1690 en la errata de RFC3696
HexAndBugs

Como dijo @flightplanner, Wikipedia resume esas secciones aquí : "pero el máximo ... restringe la dirección de correo electrónico completa a no más de 254 caracteres"
RustyTheBoyRobot

2
Especialmente si desea que el campo de correo electrónico tenga una restricción única; bajo INNODB y utf8 varchar (254) es lo suficientemente pequeño (menos de 767bytes) para tener una restricción única y varchar (300) no lo es.
Autonomía

En el RFC 3696 errata ID 1003 encontré que dice que 256 caracteres es el límite práctico (y 320 caracteres el máximo).
Arnold Schrijver

56

de Ask Metafilter :

Mis datos provienen de una base de datos de 323 direcciones. La distribución tiene algunos valores atípicos superiores (sesgados positivamente). Normalmente se distribuye sin los valores atípicos (lo probé).

Mín: 12 1er cuartil: 19 Media (sin valores atípicos): 23,04 Media sin valores atípicos): 22,79 3er cuartil: 26 Máx. (Sin valores atípicos): 47 Máx. (Sin valores atípicos): 35

Mediana: 23 Moda: 24 Est. Dev (con valores atípicos): 5,20 Std. Dev (sin valores atípicos): 4,70

Rangos basados ​​en datos que incluyen valores atípicos 68,2% de los datos 17,8 - 28,2 95,4% de los datos 12,6 - 33,4 99,7% de los datos 7,4 - 38,6

Rangos basados ​​en datos atípicos excluidos 68,2% de los datos 18,1 - 27,5 95,4% de los datos 13,4 - 32,2 99,7% de los datos 8,7 - 36,9

Si se registra en http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/ , su dirección de correo electrónico seguramente sería un valor atípico :)

Aquí es ¿Cuál es la longitud máxima de seguridad de una dirección de correo electrónico para permitir que en una forma de sitio web? en Raycon con una media ligeramente diferente (N = 50,496, media = 23):

Distribución de la longitud de la dirección de correo electrónico


@Masi, en realidad, lo curioso es que es una distribución de Poisson en lugar de una distribución normal: ¿alguien tiene ideas de por qué es así? : P
pageman

@pageman: La razón es que cada evento se distribuye aleatoriamente Y cada evento se toma del espacio infinito. - Obtienes una distribución similar si calculas la cantidad de autos que conducen a ROJO de manera que tengas tiempo frente a la cantidad de autos que conducen a rojo en los ejes.
Léo Léopold Hertz 준영

Personalmente, me gusta más la Ley de Benford: en.wikipedia.org/wiki/Benford%27s_law
Kitson

2
He usado 120 caracteres variables durante años. La lógica del mundo real es que incluso si alguien está listo para llenar su campo 320 varchar ... Apuesto a que tienen un correo electrónico alternativo de 40 caracteres esperando
Chukky Nze

18

Solo usa varchar(50). Los correos electrónicos más largos son una mierda, siempre.

Solo mira cuánto duran 50 caracteres:

peoplewithanemail @ ddressthislongjustuseashorterone

Si permite correos electrónicos de 255 caracteres:

  • Mostrarlos puede estropear su interfaz de usuario (en el mejor de los casos, se cortarán, en el peor, empujarán sus contenedores y márgenes) y
  • Los usuarios malintencionados pueden hacer cosas con ellos que no puede anticipar (como los casos en los que los piratas informáticos utilizaron una API en línea gratuita para almacenar una gran cantidad de datos)

(Las estadísticas muestran que nadie ingresa más de 50 caracteres para una dirección de correo electrónico legítima; consulte, por ejemplo, la respuesta de pageman https://stackoverflow.com/a/1199245/87861 )


5
Totalmente de acuerdo. ¿Quién en su sano juicio tendría ya una dirección de correo electrónico? Claro, es teóricamente correcto que un correo electrónico pueda tener 320 caracteres, pero ¿en el mundo real? En mis sistemas también uso varchar (50) y nunca he tenido una queja de que un usuario no pueda registrarse.
Norbert Norbertson

2
Sería interesante saber a partir de enormes conjuntos de datos cuál es la longitud promedio del correo electrónico en el mundo real y cuáles son los valores atípicos y cuán grandes son.
Norbert Norbertson

4
Incorrecto. Hay muchos usuarios del mundo real que tienen más de 50 caracteres en su correo electrónico y, lo que es más importante, no pueden cambiarlo solo por usted. Negarles el acceso a algo que no pueden arreglar es injusto.
Marcus Downing

2
pueden crear nuevos correos electrónicos, por supuesto que pueden. hacer de google uno.
Nicolas Manzini

Además, no se olvide de la notación más. Algunos usuarios avanzados utilizan esto para segregar y organizar sus correos electrónicos en su bandeja de entrada. Básicamente, tendrán un (sub) correo electrónico único por cada sitio web / servicio / aplicación. Por ejemplo, imaginemos que mi correo electrónico normal es mi nombre y apellido en el nombre de alguna empresa: firstnameandlastone@superacmecompany.com. Eso es ya ~ 40 caracteres. Ahora, si usé una notación más para una cuenta de stackoverflow: firstnameandlastone+stackoverflow@superacmecompany.com, eso son ~ 55 caracteres. Algunas notaciones positivas pueden ser más largas, por ejemplo, + stackoverflow-personal y * -work.
Waterlink

16

¡Mi dirección de correo electrónico del trabajo tiene más de 20 caracteres!

Lea la especificación RFC apropiada :

"La parte local de una dirección de correo electrónico puede tener hasta 64 caracteres y el nombre de dominio puede tener un máximo de 255 caracteres"


4

Los tipos de caracteres variables en las bases de datos no ocupan espacio innecesario. Por lo tanto, no hay razón para limitar estos campos tanto como sea posible. Dependiendo del nombre de una persona, el esquema de nomenclatura utilizado por su organización y su nombre de dominio, una dirección puede superar fácilmente los 20 caracteres.

No hay límite en cuanto a la longitud de la parte local y el nombre de dominio en RFC-2822 . Sin embargo, RFC-2181 limita el nombre de dominio a 255 octetos / caracteres.

Nuevamente, dado que un varchar solo usa el espacio que realmente usa la cadena que almacena, no hay razón para tener un pequeño límite para la longitud de la dirección de correo electrónico. Vaya con 512 y deje de preocuparse. Todo lo demás es optimización prematura


3

Inicialmente, el máximo es de 320 caracteres (64 + 1 + 255, como se muestra en otras respuestas) pero como RFC 3696 Errata 1003 dijo:

Sin embargo, existe una restricción en RFC 2821 sobre la longitud de una dirección en los comandos MAIL y RCPT de 256 caracteres. Dado que las direcciones que no caben en esos campos normalmente no son útiles, el límite superior de la longitud de las direcciones normalmente debería considerarse 256.

Y de RFC 5321 sección 4.5.3.1.3 :

4.5.3.1.3. Camino

La longitud total máxima de una ruta de retorno o de avance es de 256 octetos (incluidos la puntuación y los separadores de elementos)

Esto incluye los corchetes de apertura y cierre, por lo que solo nos deja 254 octetos de dirección de correo electrónico.

Pero tenga en cuenta que el número de octetos puede no ser igual al número de caracteres (un carácter puede tener 2 o más octetos). También la sección 4.5.3.1 de RFC dice que puede haber campos de más del máximo y esto es posible pero no garantizado a los servidores para que los capturen correctamente.

Y luego puede / debe usar un VARCHAR(254)para almacenar una dirección de correo electrónico.

Nota: En MySQL al menos, una columna declarada como VARCHARmenor o igual a 255 octetos se almacenará como 1 byte + length(el 1 es para almacenar la longitud) por lo que no se gana espacio si se usa un límite inferior.


No explica cómo pasa de 256 bytes a 254. Sé que este es el resultado de los corchetes de apertura / cierre, pero debería explicar esto como parte de la respuesta.
Gili

2

Como han dicho otros, mucho más grande que 20. 256 + 64 me suena bien y es compatible con RFC.

La única razón para no tener un valor tan grande para su base de datos es si le preocupa el rendimiento o el espacio, y si lo está haciendo, entonces estoy 99.99999999999999% seguro de que es una optimización prematura .

Ve a lo grande.


VARCHAR solo almacenó el número de caracteres necesarios (más la longitud). El único problema que veo es si está luchando por espacio en el límite de 8000 bytes por fila.
Richard Szalay

No estoy luchando por el espacio. Lucho por el equilibrio entre seguridad y usabilidad.
Léo Léopold Hertz 준영

2

Un campo CHAR (20) siempre ocupará 20 caracteres, ya sea que lo use todo o no. (A menudo se rellena con espacios al final.) Un campo VARCHAR (20) ocupará hasta 20 caracteres, pero puede ocupar menos. Un beneficio del ancho constante de CHAR () es saltar rápidamente a una fila en una tabla, porque puede simplemente calcular el índice en el que debe estar. El inconveniente es desperdiciar espacio.

El beneficio de los CHAR (x) de tamaño constante se pierde si tiene columnas VARCHAR (x) en su tabla. Me parece recordar que MySQL convirtió en silencio cualquier campo CHAR () en VARCHAR () detrás de escena si algunas columnas eran VARCHAR () s.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.