2009-07-29 17 views
64

Aquí es una porción extraída de mi consulta, lo que refleja el tipo de datos EMAIL_ADDRESS la columna y la propiedad:¿Cuál es la longitud óptima para una dirección de correo electrónico en una base de datos?

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

Sin embargo, John SaundersVARYING(256) utiliza.

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

Lo entiendo de tal manera que la longitud de una dirección de correo electrónico es de 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 más de 20 caracteres, utilizado por la gente común.

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

+0

¿Qué quiere decir con "óptima"? ¿Qué estás tratando de "optimizar"? –

+0

¿me estás diciendo que soy extraordinario? XD – fortran

+0

@ 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 óptima como la mejor manera de tener un sistema seguro. –

Respuesta

109

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 aparece antes del signo '@' y la parte del dominio que lo sigue. En "[email protected]", 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 de 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.

I got the original part of this information from here

+0

Parece que es mejor tomar 320 como longitud. –

+35

Sé que este es un hilo antiguo y no hay ningún problema con 320, pero el máximo real es 254 debido a una restricción de RFC2821 que impone restricciones adicionales a las citadas para las partes de dominio y locales. Si el espacio de almacenamiento es un problema, puede valer la pena saber si tropiezan con este hilo. Ver Errata ID 1690 en [errata a RFC3696] (http://www.rfc-editor.org/errata_search.php?rfc=3696) – HexAndBugs

+0

Como dijo @flightplanner, Wikipedia resume esas secciones [aquí] (http: // en .wikipedia.org/wiki/Email_address # Sintaxis): "pero el máximo ...restringe toda la dirección de correo electrónico a no más de 254 caracteres " – RustyTheBoyRobot

17

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

Lea la adecuada RFC specification:

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

+11

Siempre codifique según las especificaciones formales. – DanDan

49

de Ask Metafilter:

Mi datos provienen de una base de datos de 323 direcciones. La distribución tiene algunos valores extremos (sesgados positivamente). Normalmente es distribuido sin los valores atípicos (I probado.)

mínima: 12 primera cuartil: 19 Media (w/ valores atípicos): 23,04 Mean w/o valores atípicos): 22,79 tercera cuartil: 26 Max (w/outliers): 47 Max (sin valores atípicos): 35

Mediana: 23 Modo: 24 Std. Dev (w/ valores atípicos): 5.20 Std. Dev (sin valores atípicos): 4.70

rangos basados ​​en los datos incluidos 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 valores atípicos de datos excluidos 68,2% de 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 suscribe a http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/ a continuación su dirección de correo electrónico seguro que sería una de las demás :)

Aquí es What is the maximum safe length of an email address to allow in a website form? en Raycon con una media ligeramente diferente (N = 50.496, media = 23):

Email address length distribution

+0

@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

+0

@pageman: El motivo es que cada evento se distribuye aleatoriamente Y cada evento se toma del espacio infinito. Obtienes una distribución similar si calculas el número de automóviles que conducen a RED de manera que tienes tiempo vs. cantidad de autos que conducen a rojo en los ejes. –

+0

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

2

Como han dicho otros, mucho más grande que 20. 256 + 64 suena bien para mí, y es RFC obediente.

La única razón para no tener un valor tan grande para su base de datos es si se está preocupando de rendimiento o espacio, y si usted está haciendo eso, entonces estoy seguro de que 99,99999999999999% es optimización prematura.

Go big.

+0

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

+0

No estoy luchando por el espacio. Estoy luchando por el equilibrio entre seguridad y usabilidad. –

2

Los tipos de caracteres variables en bases de datos no ocupan espacio innecesario. Por lo tanto, no hay ninguna razón para restringir tales campos tanto como sea posible. Según el nombre de una persona, el esquema de nombres utilizado por su organización y su nombre de dominio, una dirección puede exceder 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. RFC-2181 limita el nombre de dominio a 255 octetos/caracteres.

Una vez más, dado que varchar solo utiliza el espacio realmente utilizado por la cadena que almacena, no hay ninguna razón para tener un pequeño límite para la longitud de la dirección de correo electrónico. Solo ve con 512 y deja de preocuparte. Todo lo demás es premature optimization

0

Un campo CHAR (20) siempre ocupará 20 caracteres, ya sea que lo use todo o no. (A menudo rellenado 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 perder espacio.

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

2

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

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

Y desde RFC 5321 sección 4.5.3.1.3:

4.5.3.1.3. Path

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

Esto se incluye la apertura y cierre de corchetes por lo que nos deja con sólo el 254 octetos de la 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 el RFC section 4.5.3.1 dice que puede haber campos de más que el máximo y esto es posible pero no garantizado para que los servidores 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 VARCHAR whit menor o igual que 255 octetos todos serán almacenados como 1 byte + length (el 1 es almacenar la longitud) así que no hay espacio se gana si se utiliza un límite inferior.

+0

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

9

Simplemente use varchar(50). Los correos electrónicos más largos son basura todo el tiempo.

Basta con mirar el tiempo que 50 caracteres es:

peoplewithanemail @ ddressthislongjustuseashorterone

+2

Totalmente de acuerdo. ¿Quién en su sano juicio tendría una dirección de correo electrónico por más tiempo? Claro, es teóricamente correcto que un correo electrónico puede 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. –

+1

Sería interesante saber a partir de enormes conjuntos de datos cuál es la longitud media del correo electrónico en el mundo real y cuáles son los valores atípicos y qué tan grande. –

+0

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 para usted. Negarles el acceso por algo que no pueden arreglar es injusto. –

Cuestiones relacionadas