Jaka jest optymalna długość adresu e-mail w bazie danych?

95

Oto wyodrębniona część mojego zapytania, odzwierciedlająca EMAIL_ADDRESStyp danych kolumny i właściwość:

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

Jednak John Saunders używa VARYING(256).

To sugeruje mi, że niekoniecznie poprawnie zrozumiałem RÓŻNICĘ.

Rozumiem to tak, że długość adresu e-mail wynosi w moim przypadku 20 znaków, natomiast dla Jodn 256.

Kontekst w kodzie Johna

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

Nigdy nie widziałem adresów e-mail dłuższych niż 20 znaków, używanych przez zwykłych ludzi.

Jaka jest optymalna długość adresu e-mail w bazie danych?

Léo Léopold Hertz 준영
źródło
Co masz na myśli mówiąc „optymalnie”? Co próbujesz „zoptymalizować”?
S.Lott
1
@ S.Lott: Chcę zbudować bezpieczny system. Zwiększenie liczby danych wejściowych użytkownika zwiększa ryzyko, że mogą oni uruchamiać kody w bazie danych. --- Uważam, że optymalny sposób to najlepszy sposób na bezpieczny system.
Léo Léopold Hertz 준영
1
Cóż, chociaż istnieją względy bezpieczeństwa w tworzeniu czegoś nieograniczonego, przestrzeganie standardów zawsze będzie miało największy sens. Przestrzeganie tego, co „powszechne” lub „optymalne”, prawdopodobnie wprowadzi problemy z bezpieczeństwem, a następnie je zmniejszy.
Kitson
1
To pytanie w StackOverflow sugeruje, że maksymalna długość to teraz 254 znaków, łącznie ze znakiem „@”: stackoverflow.com/questions/386294/ ...
dthrasher
1
Oto pokrewny post dotyczący długości wiadomości e-mail z @DominicSayers, z bardzo dokładną odpowiedzią: stackoverflow.com/a/574698/361842
JohnLBevan,

Odpowiedzi:

135

Maksymalna długość adresu e-mail to 254 znaki.

Każdy adres e-mail składa się z dwóch części. Część lokalna znajdująca się przed znakiem „@” i następująca po nim część domeny. W „[email protected]” część lokalna to „user”, a część domeny to „example.com”.

Część lokalna nie może przekraczać 64 znaków, a część domeny nie może przekraczać 255 znaków.

Łączna długość lokalnych części + @ + domeny adresu e-mail nie może przekraczać 254 znaków. Zgodnie z opisem w RFC3696 Errata ID 1690 .

Stąd uzyskałem oryginalną część tych informacji

Iain Hoult
źródło
Wydaje się, że najlepiej przyjąć 320 jako długość.
Léo Léopold Hertz 준영
40
Wiem, że jest to stary wątek i nie ma problemu z używaniem 320, ale rzeczywiste maksimum to 254 z powodu nadrzędnego ograniczenia z RFC2821, które nakłada dodatkowe ograniczenia ponad te podane dla części lokalnej i domeny. Jeśli problemem jest przestrzeń dyskowa, warto wiedzieć, czy natkną się na ten wątek. Zobacz Errata ID 1690 w errata do RFC3696
HexAndBugs
Jak powiedział @flightplanner, Wikipedia podsumowuje te sekcje tutaj : „ale maksymalny… ogranicza cały adres e-mail do nie więcej niż 254 znaków”
RustyTheBoyRobot
2
Zwłaszcza jeśli chcesz, aby pole e-mail miało unikalne ograniczenie; pod INNODB i utf8 varchar (254) jest wystarczająco mały (mniej niż 767 bajtów), aby mieć unikalne ograniczenie, a varchar (300) nie.
Autonomia
W dokumencie RFC 3696 errata ID 1003 stwierdziłem, że praktycznym ograniczeniem jest 256 znaków (a maksymalnie 320 znaków).
Arnold Schrijver
56

z Ask Metafilter :

Moje dane pochodzą z bazy danych 323 adresów. Rozkład ma pewne skrajne wartości odstające (dodatnio wypaczone). Jest normalnie rozłożony bez wartości odstających (testowałem to).

Min: 12 Pierwszy kwartyl: 19 Średnia (bez wartości odstających): 23,04 Średnia bez wartości odstających): 22,79 Trzeci kwartyl: 26 Maks. (Bez wartości odstających): 47 Maks. (Bez wartości odstających): 35

Mediana: 23 Tryb: 24 Std. Odchylenie (z wartościami odstającymi): 5,20 Std. Odchylenie (bez wartości odstających): 4,70

Zakresy oparte na danych z uwzględnieniem wartości odstających 68,2% danych 17,8 - 28,2 95,4% danych 12,6 - 33,4 99,7% danych 7,4 - 38,6

Przedziały oparte na danych wykluczonych wartości odstających 68,2% danych 18,1 - 27,5 95,4% danych 13,4 - 32,2 99,7% danych 8,7 - 36,9

Jeśli zarejestrujesz się w http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/, Twój adres e-mail z pewnością będzie odstający :)

Oto jaka jest maksymalna bezpieczna długość adresu e-mail, na którą można zezwolić w formularzu strony internetowej? na Raycon z nieco inną średnią (N = 50,496, średnia = 23):

Rozkład długości adresów e-mail

pageman
źródło
@Masi, właściwie, ciekawe jest to, że jest to rozkład Poissona, a nie rozkład normalny - ktoś ma pomysły, dlaczego tak jest? : P
pageman
@pageman: Powodem jest to, że każde zdarzenie jest rozdzielane losowo ORAZ każde zdarzenie jest pobierane z przestrzeni nieskończoności. - Podobny rozkład uzyskasz, jeśli obliczysz liczbę samochodów jadących na czerwono, tak że masz czas w porównaniu z liczbą samochodów jadących na czerwono na osiach.
Léo Léopold Hertz 준영
Osobiście bardziej podoba mi się Prawo Benforda: en.wikipedia.org/wiki/Benford%27s_law
Kitson
2
Od lat używam 120 znaków zmiennych. Logika rzeczywistym świecie jest to, że nawet jeśli ktoś jest gotów wypełnić pole varchar 320 ... Założę się, że mają 40 char alternatywny email tylko stojący
Chukky Nze
18

Po prostu użyj varchar(50). Dłuższe e-maile za każdym razem są bzdurne.

Spójrz tylko, ile ma 50 znaków:

peoplewithanemail @ ddressthislongjustuseashorterone

Jeśli zezwolisz na e-maile o długości 255 znaków:

  • Wyświetlanie ich może zepsuć interfejs użytkownika (w najlepszym przypadku zostaną odcięte, w najgorszym będą przepychać pojemniki i marginesy) i
  • Złośliwi użytkownicy mogą robić z nimi rzeczy, których nie można przewidzieć (na przykład w przypadkach, gdy hakerzy używali bezpłatnego internetowego interfejsu API do przechowywania dużej ilości danych)

(Statystyki pokazują, że nikt tak naprawdę nie wprowadza więcej niż około 50 znaków dla prawdziwego adresu e-mail, patrz np .: odpowiedź pagemana https://stackoverflow.com/a/1199245/87861 )

Nicolas Manzini
źródło
5
Kompletnie się zgadzam. Kto przy zdrowych zmysłach miałby już adres e-mail? Jasne, teoretycznie poprawne jest to, że e-mail może mieć 320 znaków, ale w prawdziwym świecie? W swoich systemach używam również varchar (50) i nigdy nie miałem skargi, że użytkownik nie może się zarejestrować.
Norbert Norbertson
2
Byłoby interesujące dowiedzieć się z ogromnych zbiorów danych, jaka jest średnia długość wiadomości e-mail w świecie rzeczywistym, jakie są wartości odstające i jak duże.
Norbert Norbertson
4
Źle. Jest wielu prawdziwych użytkowników, którzy mają więcej niż 50 znaków w swoim e-mailu, a co ważniejsze, nie mogą go zmienić tylko dla Ciebie. Odmawianie im dostępu do czegoś, czego nie mogą naprawić, jest niesprawiedliwe.
Marcus Downing
2
oczywiście mogą tworzyć nowe e-maile. uczyń google jeden.
Nicolas Manzini,
Nie zapomnij też o notacji plus. Niektórzy zaawansowani użytkownicy używają tego do segregowania i porządkowania swoich e-maili w skrzynce odbiorczej. Zasadniczo będą mieć unikalny (pod-) adres e-mail dla każdej witryny / usługi / aplikacji. Na przykład, wyobraźmy sobie, że mój zwykły adres e-mail to moje imię i nazwisko w jakiejś firmie: imię[email protected]. To już ~ 40 znaków. Teraz, gdybym użył notacji plus dla konta stackoverflow: [email protected] - to ~ 55 znaków. Niektóre notacje plus mogą być dłuższe, np. + Stackoverflow-personal i * -work.
Waterlink
16

Mój służbowy adres e-mail ma więcej niż 20 znaków!

Przeczytaj odpowiednią specyfikację RFC :

„Lokalna część adresu e-mail może mieć do 64 znaków, a nazwa domeny może mieć maksymalnie 255 znaków”

Dan Diplo
źródło
4

Zmienne typy znaków w bazach danych nie zajmują niepotrzebnej przestrzeni. Dlatego nie ma powodu, aby ograniczać takie pola w jak największym stopniu. W zależności od nazwiska osoby, schematu nazewnictwa używanego przez jej organizację i nazwy domeny, adres może z łatwością przekraczać 20 znaków.

Nie ma ograniczeń co do długości części lokalnej i nazwy domeny w RFC-2822 . RFC-2181 ogranicza jednak nazwę domeny do 255 oktetów / znaków.

Ponownie, ponieważ varchar wykorzystuje tylko przestrzeń faktycznie używaną przez przechowywany ciąg, nie ma powodu, aby mieć małe ograniczenie długości adresu e-mail. Po prostu idź z 512 i przestań się martwić. Wszystko inne to przedwczesna optymalizacja

VoidPointer
źródło
3

Początkowo maksymalna liczba to 320 znaków (64 + 1 + 255, jak pokazano w innych odpowiedziach), ale jak mówi RFC 3696 Errata 1003 :

Jednak w RFC 2821 istnieje ograniczenie dotyczące długości adresu w poleceniach MAIL i RCPT o długości 256 znaków. Ponieważ adresy, które nie mieszczą się w tych polach, nie są zwykle przydatne, należy przyjąć, że górna granica długości adresów wynosi 256.

I z RFC 5321, sekcja 4.5.3.1.3 :

4.5.3.1.3. Ścieżka

Maksymalna całkowita długość ścieżki zwrotnej lub ścieżki do przodu to 256 oktetów (łącznie ze znakami interpunkcyjnymi i separatorami elementów)

Obejmuje to nawiasy otwierające i zamykające, dzięki czemu możemy podać tylko 254 oktety adresu e-mail.

Należy jednak pamiętać, że liczba oktetów może nie być równa liczbie znaków (znak może mieć 2 lub więcej oktetów). Również sekcja RFC 4.5.3.1 mówi, że mogą istnieć pola o większej wartości niż maksymalna i jest to możliwe, ale nie jest gwarantowane, że serwery prawidłowo je wychwycą.

Następnie możesz / musisz użyć VARCHAR(254)do przechowywania adresu e-mail.

Uwaga: przynajmniej w MySQL kolumna zadeklarowana jako VARCHARodrobina mniejsza lub równa 255 oktetów będzie przechowywana jako 1 byte + length(1 oznacza długość), więc jeśli zostanie zastosowany dolny limit, nie zostanie uzyskana przestrzeń.

PhoneixS
źródło
Nie potrafisz wyjaśnić, w jaki sposób przechodzisz z 256 bajtów do 254. Wiem, że jest to wynikiem nawiasów otwierających / zamykających, ale powinieneś to wyjaśnić jako część odpowiedzi.
Gili
2

Jak powiedzieli inni, dużo większe niż 20. 256 + 64 brzmi dla mnie dobrze i jest zgodne z RFC.

Jedynym powodem, dla którego Twoja baza danych nie ma tak dużej wartości, jest to, że martwisz się o wydajność lub miejsce, a jeśli to robisz, jestem pewien na 99,9999999999999%, że jest to przedwczesna optymalizacja .

Idź na całość.

Stu Thompson
źródło
VARCHAR przechowuje tylko potrzebną liczbę znaków (plus długość). Widzę tylko problem, jeśli walczysz o miejsce w limicie 8000 bajtów na wiersz.
Richard Szalay
Nie walczę o przestrzeń. Walczę o równowagę między bezpieczeństwem a użytecznością.
Léo Léopold Hertz 준영
2

Pole CHAR (20) zawsze zajmie 20 znaków, niezależnie od tego, czy używasz go w całości, czy nie. (Często dopełniane spacjami na końcu.) Pole VARCHAR (20) zajmuje do 20 znaków, ale może zajmować mniej. Jedną z zalet stałej szerokości CHAR () jest szybkie przeskakiwanie do wiersza w tabeli, ponieważ możesz po prostu obliczyć indeks, na którym musi się znajdować. Wadą jest marnowanie miejsca.

Korzyści płynące ze stosowania znaków CHAR (x) o stałym rozmiarze są tracone, jeśli w tabeli znajdują się kolumny typu VARCHAR (x). Wydaje mi się, że MySQL po cichu konwertował wszystkie pola CHAR () na VARCHAR () za kulisami, jeśli niektóre kolumny były VARCHAR ().


źródło