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?


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 „user@example.com” 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


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


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


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ęiastone@superacmecompany.com. To już ~ 40 znaków. Teraz, gdybym użył notacji plus dla konta stackoverflow: firstnameandlastone+stackoverflow@superacmecompany.com - 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”


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


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ń.


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ść.


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 ().

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.