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


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.