ความยาวที่เหมาะสมที่สุดสำหรับที่อยู่อีเมลในฐานข้อมูลคือเท่าใด


95

นี่คือส่วนที่แยกออกมาจากข้อความค้นหาของฉันซึ่งสะท้อนถึงEMAIL_ADDRESSประเภทข้อมูลคอลัมน์และคุณสมบัติ:

EMAIL_ADDRESS CHARACTER VARYING(20) NOT NULL, 

อย่างไรก็ตามจอห์นแซนเดอVARYING(256)ใช้

สิ่งนี้ชี้ให้เห็นว่าฉันไม่จำเป็นต้องเข้าใจ VARYING อย่างถูกต้อง

ฉันเข้าใจดีว่าความยาวของที่อยู่อีเมลคือ 20 ตัวอักษรในกรณีของฉันในขณะที่ 256 สำหรับ Jodn

บริบทในรหัสของ 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)
  );

ฉันไม่เคยเห็นที่อยู่อีเมลที่ยาวเกิน 20 ตัวอักษรที่คนทั่วไปใช้

ความยาวที่เหมาะสมที่สุดสำหรับที่อยู่อีเมลในฐานข้อมูลคือเท่าใด


คำว่า "เหมาะสมที่สุด" หมายความว่าอย่างไร คุณกำลังพยายาม "เพิ่มประสิทธิภาพ" อะไร
ล็อตต์

1
@ S.Lott: ฉันต้องการสร้างระบบที่ปลอดภัย การป้อนข้อมูลของผู้ใช้ที่เพิ่มขึ้นจะเพิ่มความเสี่ยงที่จะเรียกใช้รหัสในฐานข้อมูลได้ - ฉันเห็นว่าเหมาะสมที่สุดเป็นวิธีที่ดีที่สุดในการมีระบบรักษาความปลอดภัย
LéoLéopold Hertz 준영

1
ในขณะที่มีข้อควรพิจารณาด้านความปลอดภัยในการไม่ทำสิ่งที่ไม่ถูกผูกมัด แต่การปฏิบัติตามมาตรฐานจะเหมาะสมที่สุดเสมอ การปฏิบัติตามสิ่งที่ "ธรรมดา" หรือ "เหมาะสมที่สุด" อาจทำให้เกิดปัญหาด้านความปลอดภัยจากนั้นจึงลดปัญหาดังกล่าว
Kitson

1
คำถามนี้เกี่ยวกับ StackOverflow แสดงให้เห็นว่าความยาวสูงสุดคือ 254 อักขระรวมทั้งเครื่องหมาย "@": stackoverflow.com/questions/386294/…
dthrasher

1
นี่คือโพสต์ที่เกี่ยวข้องกับความยาวอีเมลจาก @DominicSayers พร้อมคำตอบที่ละเอียดมาก: stackoverflow.com/a/574698/361842
JohnLBevan

คำตอบ:


135

ความยาวสูงสุดของที่อยู่อีเมลคือ 254 อักขระ

ที่อยู่อีเมลทั้งหมดประกอบด้วยสองส่วน ส่วนโลคัลที่อยู่ก่อนเครื่องหมาย "@" และส่วนโดเมนที่ตามหลัง ใน "user@example.com" ส่วนโลคัลคือ "ผู้ใช้" และส่วนของโดเมนคือ "example.com"

ส่วนโลคัลต้องมีความยาวไม่เกิน 64 อักขระและส่วนของโดเมนต้องมีความยาวไม่เกิน 255 อักขระ

ความยาวรวมของส่วนโดเมน + @ + ภายในของที่อยู่อีเมลต้องไม่เกิน 254 อักขระ ตามที่อธิบายไว้ในRFC3696 คหบดี ID 1690

ฉันได้รับส่วนต้นฉบับของข้อมูลนี้จากที่นี่


ดูเหมือนว่าจะดีที่สุดที่จะใช้ความยาว 320
LéoLéopold Hertz 준영

40
ฉันรู้ว่านี่เป็นเธรดเก่าและไม่มีปัญหาในการใช้ 320 แต่ค่าสูงสุดที่แท้จริงคือ 254 เนื่องจากข้อ จำกัด ที่ลบล้างจาก RFC2821 ที่กำหนดข้อ จำกัด เพิ่มเติมในส่วนที่ยกมาสำหรับส่วนภายในและโดเมน หากพื้นที่จัดเก็บเป็นปัญหาสิ่งนี้อาจคุ้มค่าที่คนจะรู้ว่าพวกเขาสะดุดกับเธรดนี้หรือไม่ ดู Errata ID 1690 ในerrata ถึง RFC3696
HexAndBugs

ดังที่ @flightplanner กล่าวว่า Wikipedia สรุปส่วนเหล่านี้ไว้ที่นี่ : "แต่สูงสุด ... จำกัด ที่อยู่อีเมลทั้งหมดให้มีความยาวไม่เกิน 254 ตัวอักษร"
RustyTheBoyRobot

2
โดยเฉพาะอย่างยิ่งถ้าคุณต้องการให้ฟิลด์อีเมลมีข้อ จำกัด เฉพาะ ภายใต้ INNODB และ utf8 varchar (254) มีขนาดเล็กพอ (น้อยกว่า 767 ไบต์) ที่จะมีข้อ จำกัด เฉพาะและ varchar (300) ไม่ใช่
เอกราช

ในRFC 3696 errata ID 1003ฉันพบว่า 256 ตัวอักษรเป็นขีด จำกัด ที่ใช้งานได้จริง (และสูงสุด 320 ตัวอักษร)
Arnold Schrijver

56

จากAsk Metafilter :

ข้อมูลของฉันมาจากฐานข้อมูล 323 ที่อยู่ การแจกแจงมีค่าผิดปกติระดับบน (เบ้เชิงบวก) โดยปกติจะแจกจ่ายโดยไม่มีค่าผิดปกติ (ฉันทดสอบแล้ว)

ต่ำสุด: 12 ควอร์ไทล์ที่ 1: 19 ค่าเฉลี่ย (w / ค่าผิดปกติ): 23.04 ค่าเฉลี่ยโดยไม่มีค่าผิดปกติ): 22.79 ควอร์ไทล์ที่ 3: 26 สูงสุด (w / ค่าผิดปกติ): 47 สูงสุด (ไม่มีค่าผิดปกติ): 35

ค่ามัธยฐาน: 23 โหมด: 24 Std. Dev (w / outliers): 5.20 Std. Dev (ไม่มีค่าผิดปกติ): 4.70

ช่วงตามข้อมูลรวมถึงค่าผิดปกติ 68.2% ของข้อมูล 17.8 - 28.2 95.4% ของข้อมูล 12.6 - 33.4 99.7% ของข้อมูล 7.4 - 38.6

ช่วงตามค่าผิดปกติของข้อมูลยกเว้น 68.2% ของข้อมูล 18.1 - 27.5 95.4% ของข้อมูล 13.4 - 32.2 99.7% ของข้อมูล 8.7 - 36.9

หากคุณลงชื่อสมัครใช้http://www.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijk.com/ ที่อยู่อีเมลของคุณก็จะเป็นค่าผิดปกติ :)

นี่คือความยาวสูงสุดที่ปลอดภัยของที่อยู่อีเมลที่อนุญาตในรูปแบบเว็บไซต์คืออะไร? บน Raycon ด้วยค่าเฉลี่ยที่แตกต่างกันเล็กน้อย (N = 50,496, mean = 23):

การกระจายความยาวของที่อยู่อีเมล


ที่จริงแล้วสิ่งที่อยากรู้คือมันเป็นการแจกแจงแบบปัวซองมากกว่าการแจกแจงแบบปกติใครมีความคิดว่าทำไมถึงเป็นแบบนั้น : P
เพจแมน

@pageman: เหตุผลก็คือแต่ละเหตุการณ์จะถูกกระจายแบบสุ่มและแต่ละเหตุการณ์จะถูกนำมาจากพื้นที่อินฟินิตี้ - คุณจะได้รับการแจกแจงที่ใกล้เคียงกันหากคุณคำนวณจำนวนรถที่ขับไปที่ RED เพื่อให้คุณมีเวลาเทียบกับจำนวนรถที่ขับเป็นสีแดงในแกน
LéoLéopold Hertz 준영

โดยส่วนตัวแล้วฉันชอบกฎของเบนฟอร์ดมากกว่า: en.wikipedia.org/wiki/Benford%27s_law
Kitson

2
ฉันใช้อักขระตัวแปร 120 ตัวมาหลายปีแล้ว ตรรกะของโลกแห่งความเป็นจริงก็คือแม้ว่าจะมีใครบางคนพร้อมที่จะเติมฟิลด์ 320 varchar ของคุณ ... ฉันพนันได้เลยว่าพวกเขามีอีเมลทางเลือก 40 ตัวที่รออยู่
Chukky Nze

18

เพียงแค่ใช้varchar(50). อีเมลที่ยาวขึ้นมักจะไร้สาระทุกครั้ง

ดูว่า 50 ตัวอักษรยาวแค่ไหน:

ขาย Handgel

หากคุณอนุญาตอีเมล 255 อักขระ:

  • การแสดงสิ่งเหล่านี้อาจทำให้ UI ของคุณยุ่งเหยิง (อย่างดีที่สุดก็จะถูกตัดออกอย่างที่แย่ที่สุดก็คือดันคอนเทนเนอร์และระยะขอบของคุณไปรอบ ๆ ) และ
  • ผู้ใช้ที่เป็นอันตรายสามารถทำสิ่งต่างๆกับพวกเขาที่คุณคาดไม่ถึง (เช่นกรณีที่แฮกเกอร์ใช้ API ออนไลน์ฟรีเพื่อจัดเก็บข้อมูลจำนวนมาก)

(สถิติแสดงให้เห็นว่าไม่มีใครป้อนมากกว่า 50 ตัวอักษรสำหรับที่อยู่อีเมลที่ถูกต้องโปรดดูที่คำตอบของเพจแมนhttps://stackoverflow.com/a/1199245/87861 )


5
เห็นด้วยอย่างสิ้นเชิง. ใครที่คิดถูกต้องจะมีที่อยู่อีเมลอีกต่อไป แน่นอนว่ามันถูกต้องตามหลักวิชาที่อีเมลสามารถมีได้ 320 ตัวอักษร แต่ในโลกแห่งความเป็นจริง? ในระบบของฉันฉันใช้ varchar (50) ด้วยและฉันไม่เคยมีการร้องเรียนว่าผู้ใช้ไม่สามารถลงทะเบียนได้
Norbert Norbertson

2
เป็นเรื่องน่าสนใจที่จะทราบจากชุดข้อมูลขนาดใหญ่ความยาวอีเมลโดยเฉลี่ยในโลกแห่งความเป็นจริงคืออะไรและค่าผิดปกติคืออะไรและมีขนาดใหญ่เพียงใด
Norbert Norbertson

4
ไม่ถูกต้อง. มีผู้ใช้งานจริงจำนวนมากที่มีอักขระมากกว่า 50 ตัวในอีเมลและที่สำคัญพวกเขาไม่สามารถเปลี่ยนมันให้คุณได้ การปฏิเสธไม่ให้พวกเขาเข้าถึงสิ่งที่พวกเขาไม่สามารถแก้ไขได้นั้นไม่ยุติธรรม
Marcus Downing

2
พวกเขาสามารถสร้างอีเมลใหม่ได้อย่างแน่นอน ทำให้ Google เป็นหนึ่งเดียว
Nicolas Manzini

อย่าลืมเกี่ยวกับสัญกรณ์บวกด้วย ผู้ใช้ระดับสูงบางคนใช้สิ่งนี้เพื่อแยกและจัดระเบียบอีเมลในกล่องจดหมาย โดยพื้นฐานแล้วพวกเขาจะมีอีเมล (ย่อย) ที่ไม่ซ้ำกันสำหรับแต่ละเว็บไซต์ / บริการ / แอป ตัวอย่างเช่นสมมติว่าอีเมลปกติของฉันคือชื่อและนามสกุลในชื่อ บริษัท บางแห่ง: firstnameandlastone@superacmecompany.com นั่นคือ ~ 40 ตัวอักษร ตอนนี้ถ้าฉันใช้เครื่องหมายบวกสำหรับบัญชี stackoverflow: firstnameandlastone+stackoverflow@superacmecompany.com นั่นคือ ~ 55 อักขระ เครื่องหมายบวกบางตัวอาจยาวกว่าเช่น + stackoverflow-personal และ * -work
Waterlink

16

ที่อยู่อีเมลที่ทำงานของฉันยาวเกิน 20 อักขระ!

อ่านข้อกำหนด RFCที่เหมาะสม:

"ส่วนโลคัลของที่อยู่อีเมลอาจมีความยาวได้ถึง 64 อักขระและชื่อโดเมนอาจมีอักขระได้สูงสุด 255 ตัว"


4

ประเภทอักขระตัวแปรในฐานข้อมูลไม่ใช้พื้นที่ที่ไม่จำเป็น ดังนั้นจึงไม่มีเหตุผลที่จะ จำกัด ช่องดังกล่าวให้มากที่สุด ขึ้นอยู่กับชื่อของบุคคลรูปแบบการตั้งชื่อที่ใช้โดยองค์กรและชื่อโดเมนที่อยู่อาจมีอักขระเกิน 20 ตัวได้อย่างง่ายดาย

มีการ จำกัด ให้เป็นไปตามความยาวของท้องถิ่นและส่วนหนึ่งของชื่อโดเมนในไม่เป็นRFC-2822 RFC-2181จำกัด ชื่อโดเมนไว้ที่ 255 อ็อกเต็ต / อักขระ

อีกครั้งเนื่องจากvarcharใช้เฉพาะพื้นที่ที่ใช้โดยสตริงที่คุณจัดเก็บจริงจึงไม่มีเหตุผลที่จะมีขีดจำกัดความยาวของที่อยู่อีเมลเล็กน้อย เพียงแค่ใช้ 512 และหยุดกังวล อย่างอื่นคือการเพิ่มประสิทธิภาพก่อนกำหนด


3

เริ่มแรกสูงสุดคือ 320 อักขระ (64 + 1 + 255 ตามที่แสดงในคำตอบอื่น ๆ ) แต่ตามที่RFC 3696 Errata 1003กล่าวว่า:

อย่างไรก็ตามมีข้อ จำกัด ใน RFC 2821 เกี่ยวกับความยาวของที่อยู่ในคำสั่ง MAIL และ RCPT ที่ 256 อักขระ เนื่องจากแอดเดรสที่ไม่พอดีกับฟิลด์เหล่านั้นไม่เป็นประโยชน์ตามปกติขีด จำกัด บนของความยาวแอดเดรสควรถือว่าเป็น 256

และจากRFC 5321ส่วน4.5.3.1.3 :

4.5.3.1.3. เส้นทาง

ความยาวรวมสูงสุดของเส้นทางย้อนกลับหรือเส้นทางเดินหน้าคือ 256 อ็อกเต็ต (รวมเครื่องหมายวรรคตอนและตัวคั่นองค์ประกอบ)

ซึ่งรวมถึงวงเล็บเปิดและปิดดังนั้นเราจึงเหลือที่อยู่อีเมลเพียง254 อ็อกเต็ต

แต่โปรดทราบว่าจำนวนอ็อกเต็ตอาจไม่เท่ากับจำนวนอักขระ (อักขระอาจมี 2 อ็อกเท็ตหรือมากกว่า) นอกจากนี้ส่วน RFC 4.5.3.1 ยังบอกด้วยว่าอาจมีฟิลด์มากกว่านั้นที่ค่าสูงสุดและเป็นไปได้ แต่ไม่รับประกันกับเซิร์ฟเวอร์ว่าจะจับได้อย่างถูกต้อง

จากนั้นคุณสามารถ / ต้องใช้VARCHAR(254)เพื่อจัดเก็บที่อยู่อีเมล

หมายเหตุ: ใน MySQL อย่างน้อยคอลัมน์ที่ประกาศว่าVARCHARเล็กน้อยน้อยกว่าหรือเท่ากับ 255 อ็อกเต็ตจะถูกจัดเก็บทั้งหมดเป็น1 byte + length(1 คือการจัดเก็บความยาว) ดังนั้นจึงไม่มีช่องว่างใด ๆ หากใช้ขีด จำกัด ล่าง


คุณไม่ได้อธิบายว่าคุณเปลี่ยนจาก 256 ไบต์เป็น 254 ได้อย่างไรฉันรู้ว่านี่เป็นผลมาจากวงเล็บเปิด / ปิด แต่คุณควรอธิบายสิ่งนี้เป็นส่วนหนึ่งของคำตอบ
Gili

2

อย่างที่คนอื่นบอกวิธีที่ใหญ่กว่า 20 256 + 64 ฟังดูดีสำหรับฉันและเป็นไปตามข้อกำหนด RFC

เหตุผลเดียวที่จะไม่ได้เช่นค่าขนาดใหญ่สำหรับฐานข้อมูลของคุณถ้าคุณกำลังกังวลเกี่ยวกับประสิทธิภาพหรือพื้นที่และถ้าคุณกำลังทำนั้นฉัน 99.99999999999999% ว่าเป็นการเพิ่มประสิทธิภาพก่อนวัยอันควร

ไปกันใหญ่


VARCHAR เก็บเฉพาะจำนวนอักขระที่ต้องการ (บวกความยาว) ปัญหาเดียวที่ฉันเห็นคือหากคุณกำลังต่อสู้เพื่อพื้นที่ในขีด จำกัด 8000 ไบต์ต่อแถว
Richard Szalay

ฉันไม่ได้ต่อสู้เพื่อพื้นที่ ฉันกำลังต่อสู้เพื่อความสมดุลระหว่างความปลอดภัยและการใช้งาน
LéoLéopold Hertz 준영

2

ช่อง CHAR (20) จะใช้อักขระ 20 ตัวเสมอไม่ว่าคุณจะใช้ทั้งหมดหรือไม่ก็ตาม (มักมีช่องว่างที่ด้านท้าย) ช่อง VARCHAR (20) จะใช้อักขระไม่เกิน 20 ตัว แต่อาจใช้เวลาน้อยกว่านี้ ข้อดีอย่างหนึ่งของความกว้างคงที่ของ CHAR คือการกระโดดไปยังแถวในตารางอย่างรวดเร็วเพราะคุณสามารถคำนวณดัชนีที่ต้องอยู่ได้ ข้อเสียเปรียบคือการสิ้นเปลืองพื้นที่

ประโยชน์ของ CHAR (x) ขนาดคงที่จะหายไปหากคุณมีคอลัมน์ VARCHAR (x) ในตารางของคุณ ฉันดูเหมือนจะจำได้ว่า MySQL แปลงฟิลด์ CHAR () ใด ๆ เป็น VARCHAR () อยู่เบื้องหลังหากบางคอลัมน์เป็น VARCHAR ()

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.