Berapa panjang optimal untuk alamat email dalam database?

95

Berikut adalah bagian dari kueri saya, yang mencerminkan EMAIL_ADDRESStipe data kolom dan properti:

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

Namun, John Saunders menggunakan VARYING(256).

Ini menunjukkan kepada saya bahwa saya belum memahami VARYING dengan benar.

Saya memahaminya sehingga panjang alamat email adalah 20 karakter dalam kasus saya, sedangkan 256 untuk Jodn.

Konteks dalam kode 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)
  );

Saya belum pernah melihat alamat email lebih dari 20 karakter, digunakan oleh orang biasa.

Berapa panjang optimal untuk alamat email dalam database?

Léo Léopold Hertz 준영
sumber
Apa yang Anda maksud dengan "optimal"? Apa yang Anda coba "optimalkan"?
S. Lott
1
@ S. Lott: Saya ingin membangun sistem yang aman. Peningkatan input pengguna meningkatkan risiko bahwa mereka dapat menjalankan kode dalam database. --- Saya melihat optimal sebagai cara terbaik untuk memiliki sistem yang aman.
Léo Léopold Hertz 준영
1
Nah, meskipun ada pertimbangan keamanan untuk tidak membuat sesuatu yang tidak terbatas, mendengarkan standar akan selalu menjadi hal yang paling masuk akal. Mengikuti apa yang "umum" atau "optimal" kemungkinan besar akan menimbulkan masalah keamanan, lalu menguranginya.
Kitson
1
Pertanyaan di StackOverflow ini menyarankan bahwa panjang maksimal sekarang adalah 254 karakter termasuk tanda "@": stackoverflow.com/questions/386294/…
dthrasher
1
Berikut posting terkait tentang panjang email dari @DominicSayers, dengan jawaban yang sangat menyeluruh: stackoverflow.com/a/574698/361842
JohnLBevan

Jawaban:

135

Panjang maksimum alamat email adalah 254 karakter.

Setiap alamat email terdiri dari dua bagian. Bagian lokal yang muncul sebelum tanda '@', dan bagian domain yang mengikutinya. Di "[email protected]", bagian lokalnya adalah "pengguna", dan bagian domainnya adalah "example.com".

Bagian lokal tidak boleh melebihi 64 karakter dan bagian domain tidak boleh lebih dari 255 karakter.

Panjang gabungan bagian domain + @ + lokal dari sebuah alamat email tidak boleh lebih dari 254 karakter. Seperti yang dijelaskan dalam RFC3696 Errata ID 1690 .

Saya mendapatkan bagian asli dari informasi ini dari sini

Iain Hoult
sumber
Tampaknya yang terbaik adalah mengambil 320 sebagai panjangnya.
Léo Léopold Hertz 준영
40
Saya tahu ini adalah utas lama dan tidak ada masalah menggunakan 320, tetapi maksimum sebenarnya adalah 254 karena batasan utama dari RFC2821 yang memberlakukan batasan tambahan di atas dan di atas yang dikutip untuk bagian lokal dan domain. Jika ruang penyimpanan menjadi masalah, ini mungkin perlu diketahui orang jika mereka tersandung pada utas ini. Lihat Errata ID 1690 dalam errata ke RFC3696
HexAndBugs
Seperti yang dikatakan @flightplanner, Wikipedia merangkum bagian-bagian tersebut di sini : "tetapi maksimum ... membatasi seluruh alamat email tidak boleh lebih dari 254 karakter"
RustyTheBoyRobot
2
Terutama jika Anda ingin bidang email memiliki batasan unik; di bawah INNODB dan utf8 varchar (254) cukup kecil (kurang dari 767 byte) untuk memiliki batasan unik dan varchar (300) tidak.
Otonomi
Dalam RFC 3696 errata ID 1003 saya menemukan bahwa 256 karakter adalah batas praktis (dan maksimum 320 karakter).
Arnold Schrijver
56

dari Ask Metafilter :

Data saya berasal dari database dengan 323 alamat. Distribusi memiliki beberapa pencilan ujung atas (miring positif). Ini biasanya didistribusikan tanpa pencilan (saya mengujinya.)

Min: 12 Kuartil ke-1: 19 Rata-rata (tanpa pencilan): 23,04 Rata-rata tanpa pencilan): 22,79 Kuartil ke-3: 26 Maks (tanpa pencilan): 47 Maks (tanpa pencilan): 35

Median: 23 Mode: 24 Std. Dev (tanpa pencilan): 5.20 Std. Dev (tanpa pencilan): 4.70

Rentang berdasarkan data termasuk pencilan 68,2% data 17,8 - 28,2 95,4% data 12,6 - 33,4 99,7% data 7,4 - 38,6

Rentang berdasarkan pencilan data mengecualikan 68,2% data 18,1 - 27,5 95,4% data 13,4 - 32,2 99,7% data 8,7 - 36,9

Jika Anda mendaftar untuk http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/ maka alamat email Anda pasti akan menjadi outlier :)

Berikut Berapa panjang aman maksimum dari sebuah alamat email yang diperbolehkan dalam formulir situs web? pada Raycon dengan mean yang sedikit berbeda (N = 50,496, mean = 23):

Distribusi panjang alamat email

orang kafir
sumber
@Masi sebenarnya yang membuat penasaran adalah bahwa ini adalah distribusi Poisson daripada distribusi normal - ada yang punya ide mengapa seperti itu? : P
pageman
@pageman: Alasannya adalah bahwa setiap peristiwa didistribusikan secara acak DAN setiap peristiwa diambil dari ruang tanpa batas. - Anda mendapatkan distribusi serupa jika Anda menghitung jumlah mobil yang mengemudi ke MERAH sehingga Anda memiliki waktu vs. jumlah mobil yang mengemudi ke warna merah di sumbu.
Léo Léopold Hertz 준영
Secara pribadi saya lebih menyukai Hukum Benford: en.wikipedia.org/wiki/Benford%27s_law
Kitson
2
Saya telah menggunakan 120 karakter variabel selama bertahun-tahun. Logika dunia nyata adalah bahwa bahkan jika seseorang siap untuk mengisi bidang 320 varchar Anda ... Saya yakin mereka memiliki email alternatif 40 karakter yang hanya menunggu
Chukky Nze
18

Gunakan saja varchar(50). Email yang lebih panjang adalah omong kosong, setiap saat.

Lihat saja berapa panjang 50 karakter itu:

peoplewithanemail @ ddressthislongjustuseashorterone

Jika Anda mengizinkan 255 karakter email:

  • Menampilkannya dapat mengacaukan UI Anda (paling banter mereka akan terputus, paling buruk mereka mendorong kontainer dan margin Anda) dan
  • Pengguna jahat dapat melakukan hal-hal yang tidak dapat Anda antisipasi (seperti kasus di mana peretas menggunakan API online gratis untuk menyimpan banyak data)

(Statistik menunjukkan bahwa tidak ada yang benar-benar memasukkan lebih dari sekitar 50 karakter untuk alamat email yang sah, lihat misalnya: jawaban pageman https://stackoverflow.com/a/1199245/87861 )

Nicolas Manzini
sumber
5
Setuju. Siapa yang waras yang masih memiliki alamat email? Tentu, secara teori benar bahwa email bisa 320 karakter tetapi di dunia nyata? Di sistem saya, saya juga menggunakan varchar (50) dan saya tidak pernah memiliki keluhan bahwa pengguna tidak dapat mendaftar.
Norbert Norbertson
2
Akan menarik untuk mengetahui dari kumpulan data yang besar apa rata-rata panjang email dunia nyata dan apa pencilannya dan seberapa besar.
Norbert Norbertson
4
Salah. Ada banyak pengguna dunia nyata yang memiliki lebih dari 50 karakter di email mereka, dan yang lebih penting mereka tidak dapat mengubahnya hanya untuk Anda. Menolak akses mereka untuk sesuatu yang tidak bisa mereka perbaiki adalah tidak adil.
Marcus Downing
2
mereka bisa membuat email baru tentu saja mereka bisa. jadikan google satu.
Nicolas Manzini
Selain itu, jangan lupa tentang notasi plus. Beberapa power user menggunakan ini untuk memisahkan dan mengatur email mereka di kotak masuk mereka. Pada dasarnya, mereka akan memiliki email (sub-) unik untuk setiap situs web / layanan / aplikasi. Sebagai contoh, bayangkan email normal saya adalah nama depan dan nama belakang saya di beberapa nama perusahaan: [email protected]. Itu sudah ~ 40 karakter. Sekarang, jika saya menggunakan notasi plus untuk akun stackoverflow: [email protected]— itu ~ 55 karakter. Beberapa notasi plus mungkin lebih panjang, misalnya, + stackoverflow-personal dan * -work.
Waterlink
16

Alamat email kantor saya lebih dari 20 karakter!

Baca spesifikasi RFC yang sesuai :

"Bagian lokal dari alamat email dapat mencapai 64 karakter dan nama domain dapat memiliki maksimal 255 karakter"

Dan Diplo
sumber
4

Jenis karakter variabel dalam database tidak menempati ruang yang tidak dibutuhkan. Jadi, tidak ada alasan untuk membatasi bidang seperti itu sebanyak mungkin. Bergantung pada nama seseorang, skema penamaan yang digunakan oleh organisasi mereka dan nama domain mereka, sebuah alamat dapat dengan mudah melebihi 20 karakter.

Tidak ada batasan untuk panjang bagian-lokal dan nama-domain di RFC-2822 . RFC-2181 membatasi nama domain hingga 255 oktet / karakter.

Sekali lagi, karena varchar hanya menggunakan ruang yang sebenarnya digunakan oleh string yang Anda simpan, tidak ada alasan untuk memiliki batas kecil untuk panjang alamat email. Gunakan saja 512 dan berhentilah khawatir. Yang lainnya adalah pengoptimalan prematur

VoidPointer
sumber
3

Awalnya maksimum adalah 320 karakter (64 + 1 + 255, seperti yang ditunjukkan di jawaban lain) tetapi seperti yang dikatakan RFC 3696 Errata 1003 :

Namun, ada batasan di RFC 2821 tentang panjang alamat dalam perintah MAIL dan RCPT 256 karakter. Karena alamat yang tidak sesuai dengan bidang tersebut biasanya tidak berguna, batas atas panjang alamat biasanya harus dianggap 256.

Dan dari RFC 5321 bagian 4.5.3.1.3 :

4.5.3.1.3. Jalan

Total panjang maksimum jalur balik atau jalur maju adalah 256 oktet (termasuk tanda baca dan pemisah elemen)

Ini termasuk tanda kurung buka dan tutup jadi biarlah kita hanya 254 oktet dari alamat email.

Tetapi perlu diingat bahwa jumlah oktet mungkin tidak sama dengan jumlah karakter (karakter dapat memiliki 2 oktet atau lebih). Juga bagian RFC 4.5.3.1 mengatakan bahwa mungkin ada bidang lebih dari yang maksimum dan ini mungkin tetapi tidak dijamin server untuk menangkapnya dengan benar.

Dan kemudian Anda dapat / harus menggunakan a VARCHAR(254)untuk menyimpan alamat email.

Catatan: Setidaknya di MySQL, kolom yang dideklarasikan VARCHARsedikit kurang atau sama dengan 255 oktet akan disimpan sebagai 1 byte + length(1 untuk menyimpan panjang) sehingga tidak ada ruang yang diperoleh jika menggunakan batas bawah.

PhoneixS
sumber
Anda gagal menjelaskan bagaimana Anda beralih dari 256 byte menjadi 254. Saya tahu ini adalah hasil dari tanda kurung buka / tutup, tetapi Anda harus menjelaskan ini sebagai bagian dari jawabannya.
Gili
2

Seperti yang dikatakan orang lain, jauh lebih besar dari 20. 256 + 64 terdengar bagus bagi saya, dan sesuai dengan RFC.

Satu-satunya alasan untuk tidak memiliki nilai yang besar untuk database Anda adalah jika Anda mengkhawatirkan kinerja atau ruang, dan jika Anda melakukannya maka saya 99.99999999999999% yakin itu adalah pengoptimalan prematur .

Besarkan.

Stu Thompson
sumber
VARCHAR hanya menyimpan jumlah karakter yang dibutuhkan (ditambah panjangnya). Satu-satunya masalah yang saya lihat adalah jika Anda memperjuangkan ruang dalam batas 8000 byte per baris.
Richard Szalay
Saya tidak berjuang untuk ruang angkasa. Saya memperjuangkan keseimbangan antara keamanan dan kegunaan.
Léo Léopold Hertz 준영
2

Bidang CHAR (20) akan selalu mengambil 20 karakter, baik Anda menggunakan semuanya atau tidak. (Sering kali diisi dengan spasi di bagian akhir.) Bidang VARCHAR (20) akan memakan waktu hingga 20 karakter, tetapi mungkin kurang dari itu. Salah satu keuntungan dari lebar konstan CHAR () adalah lompat cepat ke baris dalam tabel, karena Anda bisa menghitung indeks tempatnya berada. Kekurangannya adalah membuang-buang ruang.

Manfaat CHAR (x) berukuran konstan akan hilang jika Anda memiliki kolom VARCHAR (x) di tabel Anda. Sepertinya saya ingat bahwa MySQL diam-diam mengubah kolom CHAR () menjadi VARCHAR () di belakang layar jika beberapa kolom adalah VARCHAR ().


sumber