Veritabanındaki bir e-posta adresi için en uygun uzunluk nedir?


95

Sorgumun EMAIL_ADDRESSsütun veri türünü ve özelliğini yansıtan çıkarılmış bir kısmı :

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

Ancak John Saunders kullanır VARYING(256).

Bu bana, VARYING'i doğru olarak anlamam gerekmediğini gösteriyor.

Benim durumumda bir e-posta adresinin uzunluğunun 20 karakter, Jodn için ise 256 karakter olduğunu anlıyorum.

John'un kodundaki bağlam

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)
  );

Sıradan insanlar tarafından kullanılan 20 karakterden uzun e-posta adreslerini hiç görmedim.

Veritabanındaki bir e-posta adresi için en uygun uzunluk nedir?


"Optimal" derken neyi kastediyorsunuz? Neyi "optimize etmeye" çalışıyorsunuz?
S.Lott

1
@ S.Lott: Güvenli bir sistem kurmak istiyorum. Kullanıcının girdisindeki artış, veritabanında kod çalıştırma riskini artırır. --- Güvenli bir sisteme sahip olmanın en iyi yolu olarak optimal görüyorum.
Léo Léopold Hertz 준영

1
Sınırsız bir şey yapmamak için güvenlik hususları varken, standartlara bağlı kalmak her zaman en mantıklı olacaktır. "Yaygın" veya "en uygun" olanı izlemek, muhtemelen güvenlik sorunlarını ortaya çıkaracak ve sonra bunları azaltacaktır.
Kitson

1
StackOverflow'daki bu soru, maksimum uzunluğun artık "@" işareti dahil 254 karakter olduğunu gösteriyor: stackoverflow.com/questions/386294/…
dthrasher

1
İşte @DominicSayers'ın e-posta uzunluğu ile ilgili, gerçekten kapsamlı bir cevapla ilgili bir gönderi: stackoverflow.com/a/574698/361842
JohnLBevan

Yanıtlar:


135

Bir e-posta adresinin maksimum uzunluğu 254 karakterdir.

Her e-posta adresi iki bölümden oluşur. '@' İşaretinden önce gelen yerel kısım ve onu izleyen alan kısmı. "Kullanıcı@example.com" da yerel kısım "kullanıcı" ve alan kısmı "example.com" dur.

Yerel kısım 64 karakteri geçmemelidir ve etki alanı kısmı 255 karakterden uzun olamaz.

Bir e-posta adresinin yerel + @ + etki alanı bölümlerinin toplam uzunluğu 254 karakteri geçmemelidir. RFC3696 Hata Kimliği 1690'da açıklandığı gibi .

Bu bilginin orijinal kısmını buradan aldım


Uzunluk olarak 320 almak en iyisi gibi görünüyor.
Léo Léopold Hertz 준영

40
Bunun eski bir iş parçacığı olduğunu ve 320 kullanımında bir sorun olmadığını biliyorum, ancak gerçek maksimum, yerel ve etki alanı bölümleri için alıntılananların üzerine ve üstüne ek kısıtlamalar getiren RFC2821'den gelen bir geçersiz kılma kısıtlaması nedeniyle 254'tür. Depolama alanı bir sorunsa, bu konuya takılıp düşmediklerini bilmeye değer olabilir. RFC3696
HexAndBugs

@Flightplanner'ın dediği gibi, Wikipedia burada bu bölümleri özetliyor : "ancak maksimum ... tüm e-posta adresinin 254 karakterden fazla olmamasını
kısıtlıyor

2
Özellikle e-posta alanının benzersiz bir kısıtlamaya sahip olmasını istiyorsanız; INNODB ve utf8 altında varchar (254) benzersiz bir kısıtlamaya sahip olmak için yeterince küçüktür (767 bayttan az) ve varchar (300) değildir.
Özerklik

Gelen RFC 3696 errata kimliği 1003 o 256 karakter pratik bir sınır (320 karakter maksimum) olduğunu bulmuşlar.
Arnold Schrijver

56

dan Metafilter Ask :

Verilerim 323 adreslik bir veritabanından geliyor. Dağılımın bazı üst uç aykırı değerleri vardır (pozitif çarpık). Normalde aykırı değerler olmadan dağıtılır (test ettim.)

Min: 12 1. çeyrek: 19 Ortalama (aykırı değerler): 23.04 Ortalama aykırı değerler): 22.79 3. çeyrek: 26 Maks (aykırı değerler ile): 47 Maks (aykırı değerler hariç): 35

Medyan: 23 Mod: 24 Std. Dev (aykırı değerlerle): 5.20 Std. Dev (aykırı değerler hariç): 4,70

Aykırı değerleri içeren verilere dayalı aralıklar Verilerin% 68,2'si 17,8 - 28,2 Verilerin% 95,4'ü 12,6 - 33,4% 99,7'si 7,4 - 38,6

Veri aykırı değerlerine dayalı aralıklar verinin% 68,2'sini hariç tuttu 18,1 - 27,5 Verinin% 95,4'ü 13,4 - 32,2 Verinin% 99,7'si 8.7 - 36.9

Http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/ için kaydolursanız , e-posta adresiniz kesinlikle aykırı olacaktır :)

İşte bir web sitesi şeklinde izin e-posta adresi maksimum güvenli uzunluğu nedir? Raycon üzerinde biraz farklı bir ortalamaya sahip (N = 50,496, ortalama = 23):

E-posta adresi uzunluk dağılımı


@Masi aslında merak uyandıran şey bunun normal bir dağılımdan çok bir Poisson dağılımı olması - herhangi birinin neden böyle olduğuna dair bir fikri var mı? : P
pageman

@pageman: Bunun nedeni, her olayın rastgele dağıtılması VE her olayın sonsuzluk uzayından alınmasıdır. - KIRMIZI'ya giden araba sayısını, eksende kırmızıya giden araba sayısına karşı zamanınız olacak şekilde hesaplarsanız benzer bir dağılım elde edersiniz.
Léo Léopold Hertz 준영

Şahsen ben daha iyi Benford Kanunu gibi: en.wikipedia.org/wiki/Benford%27s_law
Kitson

2
Yıllardır 120 değişken karakter kullandım. Gerçek dünya mantığı şu ki, birisi 320 varchar alanınızı doldurmaya hazır olsa bile ... Bahse girerim 40 karakterlik bir alternatif e-postası vardır
Chukky Nze

18

Sadece kullan varchar(50). Her seferinde daha uzun e-postalar saçmadır.

50 karakterin ne kadar uzun olduğuna bir bakın:

insanlarwithanemail @ ddressthislongjustuseashorterone

255 karakterlik e-postalara izin verirseniz:

  • Bunları görüntülemek, kullanıcı arayüzünüzü bozabilir (en iyi ihtimalle kesilecekler, en kötü ihtimalle kapsayıcılarınızı ve kenar boşluklarınızı iteceklerdir) ve
  • Kötü niyetli kullanıcılar onlarla tahmin edemeyeceğiniz şeyler yapabilir (bilgisayar korsanlarının bir sürü veriyi depolamak için ücretsiz bir çevrimiçi API kullandığı durumlar gibi)

(İstatistikler, gerçekte hiç kimsenin yasal bir e-posta adresi için yaklaşık 50 karakterden fazlasını girmediğini göstermektedir, örneğin bkz: pageman'ın cevabı https://stackoverflow.com/a/1199245/87861 )


5
Tamamen katılıyorum. Artık aklı başında kimlerin bir e-posta adresi olabilir? Elbette, teorik olarak bir e-postanın 320 karakter olabileceği ancak gerçek dünyada doğru mu? Sistemlerimde varchar (50) da kullanıyorum ve hiçbir zaman bir kullanıcının kayıt olamayacağına dair bir şikayetim olmadı.
Norbert Norbertson

2
Büyük veri kümelerinden ortalama gerçek dünya e-posta uzunluğunun ne olduğunu ve aykırı değerlerin ne olduğunu ve ne kadar büyük olduğunu bilmek ilginç olurdu.
Norbert Norbertson

4
Yanlış. E-postalarında 50'den fazla karakter bulunan pek çok gerçek dünya kullanıcısı var ve daha da önemlisi, bunu sadece sizin için değiştiremezler. Düzeltemeyecekleri bir şey için erişimlerini reddetmek haksızlıktır.
Marcus Downing

2
elbette yapabilecekleri yeni e-postalar yapabilirler. google bir yap.
Nicolas Manzini

Ayrıca, artı gösterimini de unutmayın. Bazı uzman kullanıcılar, e-postalarını gelen kutularında ayırmak ve düzenlemek için bunu kullanıyor. Esasen, her web sitesi / hizmet / uygulama için benzersiz (alt) bir e-postaya sahip olacaklar. Örneğin, normal e-postamın bir şirket adındaki adım ve soyadım olduğunu varsayalım: adandlastone@superacmecompany.com. Bu zaten ~ 40 karakter. Şimdi, bir stackoverflow hesabı için artı notasyonu kullandıysam: firstnameandlastone+stackoverflow@superacmecompany.com— bu ~ 55 karakterdir. Bazı artı gösterimler daha uzun olabilir, örneğin, + stackoverflow-personal ve * -work.
Waterlink

16

İş e-posta adresim 20 karakterden fazla!

Uygun RFC spesifikasyonunu okuyun :

"Bir e-posta adresinin yerel kısmı en fazla 64 karakter uzunluğunda olabilir ve alan adı maksimum 255 karaktere sahip olabilir"


4

Veritabanlarındaki değişken karakter türleri gereksiz yere yer kaplamaz. Bu nedenle, bu tür alanları olabildiğince kısıtlamak için hiçbir neden yoktur. Bir kişinin adına, organizasyonu tarafından kullanılan adlandırma şemasına ve etki alanı adına bağlı olarak, bir adres kolayca 20 karakteri aşabilir.

RFC-2822'de yerel bölüm ve etki alanı adının uzunluğuna ilişkin bir sınırlama yoktur . RFC-2181 , etki alanı adını 255 sekizli / karakterle sınırlar.

Yine, bir varchar yalnızca depoladığınız dizge tarafından gerçekten kullanılan alanı kullandığından, e-posta adresi uzunluğu için küçük bir sınıra sahip olmak için bir neden yoktur. Sadece 512 ile gidin ve endişelenmeyi bırakın. Diğer her şey erken optimizasyondur


3

Başlangıçta maksimum 320 karakterdir (diğer cevaplarda gösterildiği gibi 64 + 1 + 255), ancak RFC 3696 Errata 1003'ün dediği gibi:

Ancak, RFC 2821'de, MAIL ve RCPT komutlarındaki 256 karakterlik bir adresin uzunluğu konusunda bir kısıtlama vardır. Bu alanlara uymayan adresler normalde kullanışlı olmadığından, adres uzunluklarına ilişkin üst sınır normalde 256 olarak kabul edilmelidir.

Ve aralarından RFC 5321 bölüm 4.5.3.1.3 :

4.5.3.1.3. Yol

Bir ters yol veya ileri yolun maksimum toplam uzunluğu 256 sekizlidir (noktalama işaretleri ve öğe ayırıcılar dahil)

Bu, açılış ve kapanış parantezlerini içerir, bu nedenle bize yalnızca 254 sekizli e-posta adresine izin verir .

Ancak sekizli sayısının karakter sayısına eşit olmayabileceğini unutmayın (bir karakterde 2 veya daha fazla sekizli olabilir). Ayrıca RFC bölüm 4.5.3.1 , maksimumdan daha fazla alan olabileceğini ve bunun mümkün olduğunu, ancak sunuculara bunları doğru şekilde yakalamaları için garanti olmadığını söyler.

Ve sonra VARCHAR(254)bir e-posta adresini saklamak için a kullanabilir / kullanmalısınız .

Not: En azından VARCHARMySQL'de, 255 sekizliden daha az veya ona eşit whit olarak bildirilen bir sütunun tümü olarak saklanacaktır 1 byte + length(1 uzunluğu saklamak içindir), bu nedenle daha düşük bir limit kullanılırsa alan kazanılmaz.


256 bayttan 254'e nasıl gittiğinizi açıklayamıyorsunuz. Bunun açılış / kapanış parantezlerinin sonucu olduğunu biliyorum, ancak bunu cevabın bir parçası olarak açıklamalısınız.
Gili

2

Diğerlerinin de söylediği gibi, 20'den çok daha büyük. 256 + 64 kulağa hoş geliyor ve RFC uyumlu.

Veritabanınız için bu kadar büyük bir değere sahip olmamanın tek nedeni, performans veya alan hakkında endişeleniyorsanız ve bunu yapıyorsanız, bunun erken optimizasyon olduğundan% 99.99999999999999 eminim .

Büyük oyna.


VARCHAR yalnızca gerekli karakter sayısını (artı uzunluğu) sakladı. Gördüğüm tek sorun, satır başına 8000 bayt sınırında yer için mücadele edip etmediğiniz.
Richard Szalay

Ben uzay için savaşmıyorum. Güvenlik ve kullanılabilirlik arasındaki denge için savaşıyorum.
Léo Léopold Hertz 준영

2

Bir CHAR (20) alanı, hepsini kullansanız da kullanmasanız da, her zaman 20 karakter alacaktır. (Genellikle sonunda boşluklarla doldurulur.) Bir VARCHAR (20) alanı kaplar kadar 20 karakter, ancak daha az kadar sürebilir. CHAR () sabit genişliğinin bir faydası, tablodaki bir satıra hızlı bir şekilde atlamaktır, çünkü sadece üzerinde olması gereken dizini hesaplayabilirsiniz. Dezavantajı boşa harcamaktır.

Tablonuzda herhangi bir VARCHAR (x) sütunu varsa, sabit boyutlu CHAR (x) 'lerin yararı kaybolur. MySQL'in herhangi bir CHAR () alanını, bazı sütunlar VARCHAR () s ise, perde arkasında sessizce VARCHAR () 'a dönüştürdüğünü hatırlıyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.