मुझे किस प्रकार का डेटा डेटाबेस में ईमेल पता स्टोर करना चाहिए?


44

मैं समझता हूं कि 254 वर्ण का ईमेल पता मान्य है, लेकिन जिन क्रियान्वयनों पर मैंने शोध किया है, उनमें एक varchar (60) का उपयोग varchar (80) या समतुल्य है। उदाहरण के लिए: यह SQL सर्वर अनुशंसा varchar (80) या इस Oracle उदाहरण का उपयोग करता है

क्या पूर्ण 254 वर्ण का अधिकतम उपयोग न करने का कोई कारण है? क्या डेटा को रखने के लिए परिभाषा के अनुसार एक varchar का उपयोग केवल उतने ही भंडारण के लिए नहीं होता है?

क्या महत्वपूर्ण प्रदर्शन निहितार्थ / व्यापार-बंद हैं जो पूरे 254 संभावित वर्णों से कम उपयोग करने के लिए इतने सारे कार्यान्वयन का कारण हैं?

जवाबों:


45

मैंने हमेशा उपयोग किया है VARCHAR(320)। यहाँ पर क्यों। मानक निम्नलिखित सीमाओं को निर्धारित करता है:

  • "स्थानीय भाग" (उपयोगकर्ता नाम) के लिए 64 अक्षर।
  • @प्रतीक के लिए 1 वर्ण ।
  • डोमेन नाम के लिए 255 अक्षर।

अब, कुछ लोग कहेंगे कि आपको इससे अधिक समर्थन करने की आवश्यकता है। कुछ लोग यह भी कहेंगे कि आपको डोमेन नाम के लिए यूनिकोड का समर्थन करने की आवश्यकता है (जिसका अर्थ है कि आपको स्विच करना होगा NVARCHAR)। हालांकि इस बीच मानक बदल सकता है (खेल में त्वचा होने के बाद से कुछ समय हो गया है), मुझे पूरा विश्वास है कि इस समय दुनिया में अधिकांश सर्वर यूनिकोड ई-मेल पते स्वीकार नहीं करेंगे, और मुझे यकीन है कई सर्वरों में>> 320 अक्षरों के साथ पते बनाने और / या स्वीकार करने के मुद्दे होंगे।

उस ने कहा, अब आप सबसे खराब तैयारी कर सकते हैं, यदि आपको पसंद है (और यदि आप SQL Server 2008 R2 में डेटा संपीड़न का उपयोग कर रहे हैं या बेहतर है, तो आप यूनिकोड संपीड़न से लाभान्वित होंगे, जिसका अर्थ है कि आपको केवल पात्रों के लिए 2 बाइट जुर्माना देना होगा जो वास्तव में आवश्यक हैं यह)। इस तरह से आप अपने कॉलम को जितना चाहें उतना चौड़ा बना सकते हैं, और आप लोगों को किसी भी बहुत लंबे कबाड़ में सामान दे सकते हैं, जो वे चाहते हैं - यदि वे आपको कबाड़ नहीं देते हैं तो वे आपको एक ई-मेल प्राप्त नहीं करेंगे। यदि ई-मेल विफल रहता है तो ई-मेल प्राप्त करें। समस्या यह है कि यदि आप अवैध कबाड़ को अंदर आने देते हैं, तो आपइससे निपटना होगा। और इससे कोई फर्क नहीं पड़ता कि आप इसे किस आकार का बनाते हैं - यदि कोई 400 वर्णों को 320-वर्ण स्तंभ में रखने का प्रयास करेगा, तो कोई 1025 वर्णों को 1024-वर्ण स्तंभ में रखने का प्रयास करेगा। किसी भी समझदार व्यक्ति के पास ई-मेल पता> 320 वर्ण होने का कोई कारण नहीं है जब तक कि वे स्पष्ट रूप से सिस्टम सीमाओं का परीक्षण करने के लिए इसका उपयोग नहीं कर रहे हैं।

लेकिन इस पर राय मांगना बंद करें - और मार्गदर्शन के लिए अन्य कार्यान्वयनों को देखना बंद करें (यह सिर्फ इस मामले में ऐसा होता है कि जिन लोगों को आपने संदर्भित किया है वे अपने स्वयं के होमवर्क करने के लिए परेशान नहीं हुए और बस अपने से बाहर संख्याएं ले लीं, अच्छी तरह से, आप जानते हैं) । आपके पास मानक तक सीधी पहुंच है - सुनिश्चित करें कि आप सबसे वर्तमान संस्करण से परामर्श करते हैं, एक न्यूनतम के रूप में समर्थन करते हैं, और मानक के शीर्ष पर रहें ताकि आप ऐनक में परिवर्तन के लिए अनुकूल हो सकें।


चैट में पिंग के लिए @ypercube को EDIT धन्यवाद।

एक तरफ के रूप में, शायद आप पूरे पते को पहली बार में एक एकल कॉलम में डंप नहीं करना चाहते हैं। सामान्यीकरण यह सुझाव दे सकता है कि आप @hotmail.com15 मिलियन बार स्टोर नहीं करना चाहते हैं जब एक बहुत स्किनियर एफके इंट बस ठीक काम करेगा और चर लंबाई के कॉलम का अतिरिक्त ओवरहेड नहीं होगा। आप उपयोगकर्ता नाम को सामान्य भी कर सकते हैं, जैसा कि john.smith@hotmail.comऔर john.smith@gmail.comएक सामान्य उपयोगकर्ता नाम साझा करें - वे एक दूसरे को नहीं जानते हैं लेकिन आपका डेटाबेस इस बारे में परवाह नहीं करता है।

मैंने यहाँ इसके बारे में कुछ बात की:

http://www.mssqltips.com/sqlservertip/2657/storing-email-addresses-more-efficiently-in-sql-server/

http://www.mssqltips.com/sqlservertip/2671/storing-email-addresses-more-efficiently-in-sql-server--part-2/

यह ऊपर दी गई 254-वर्ण सीमा के लिए चुनौतियों का परिचय देता है, क्योंकि जब कोई मान्य 255-वर्ण डोमेन एक मान्य 1-वर्ण स्थानीयता के साथ संयुक्त होता है, तो इसके बारे में सर्वसम्मति प्रतीत नहीं होती है। इसे दुनिया भर के अधिकांश सर्वरों द्वारा स्वीकार किया जाना चाहिए लेकिन यह 254-वर्ण सीमा का उल्लंघन करता है। तो क्या आप एक Domainsतालिका बनाते हैं जिसमें ई-मेल पते के लिए लंबाई पर कृत्रिम रूप से कम प्रतिबंध है, जब डोमेन को एक वैध 255-वर्ण URL के रूप में फिर से उपयोग किया जा सकता है?


मुझे यह दृष्टिकोण पसंद है लेकिन ईमेल विशिष्टता के बारे में क्या? इसका प्रबंधन कैसे किया जाता है?
रॉबर्टो रिज्जी

2
@RrobertoRizzi DomainID + LocalPart या इसके विपरीत के संयोजन पर एक अद्वितीय बाधा या प्राथमिक कुंजी।
हारून बर्ट्रेंड

5

इस निर्णय के साथ कुछ विचार हैं। सबसे पहले और सबसे महत्वपूर्ण यह है कि वर्तमान और भविष्य में आवश्यक सीमाओं के पूर्वानुमानों का उपयोग करना है, जिसके लिए डेटा को अनुरूप बनाना होगा। varchar(1024)जब आप हर स्ट्रिंग कॉलम डेटा प्रकार सेट करना नहीं चाहते हैं, तो एक कारण यह है कि आप केवल एक स्ट्रिंग संग्रहीत कर रहे हैं जो 32 अक्षरों ( कीवर्ड पर जोर देना ) से अधिक नहीं होनी चाहिए

यदि आपके पास किसी प्रकार की भेद्यता है जहां ईमेल सभी 255 वर्णों में परिवर्तित हो जाते हैं, तो आप संभावित रूप से पृष्ठ विभाजन का एक लंबा प्रदर्शन प्रभाव डाल सकते हैं। यह सामान्य से बाहर लग सकता है, और यह सबसे अधिक संभावना है, लेकिन आपको व्यवसाय की आवश्यकता के लिए अपने डेटा को आकार देने की आवश्यकता है । डेटाबेस बनाम एप्लिकेशन डिबेट में उम्रदराज बाधा की तरह, मैं एक दृढ़ विश्वास रखता हूं कि डेटा स्तर पर डेटा टाइप की सीमाएं और स्वीकार्य मूल्य भी लागू होने चाहिए।

जो मुझे मेरे अगले बिंदु पर ले जाता है। डेटाबेस सबसे अधिक संभावना सिर्फ डेटा स्तरीय है। एप्लिकेशन स्तरीय उपयोग क्या करता है? उदाहरण के लिए, यदि आपके पास एक ऐसा एप्लिकेशन है जहां आप केवल एक ईमेल पते के लिए 80 वर्ण दर्ज कर सकते हैं, तो आप डेटा प्रकार को कोई बड़ा क्यों बनाना चाहेंगे? व्यवसाय को दो सवालों के जवाब देने की जरूरत है:

  1. यह क्या हो सकता है?
  2. यह क्या होना चाहिए?

तभी आपके पास आपका जवाब होगा।

क्या डेटा को रखने के लिए परिभाषा के अनुसार एक varchar का उपयोग केवल उतने ही भंडारण के लिए नहीं होता है?

हां और ना। इसकी लंबाई को रिकॉर्ड करने के लिए चर लंबाई डेटा के लिए एक तरह की ऑफसेट होने जा रही है।


3

RFC 5321 (वर्तमान SMTP कल्पना, RFC2821 का पालन करता है) बताता है:

उपयोगकर्ता नाम या अन्य स्थानीय-भाग की अधिकतम कुल लंबाई 64 ओकटेट है। एक डोमेन नाम या संख्या की अधिकतम कुल लंबाई 255 ओकटेट है

तो 64 + 255 + @ चिह्न का अर्थ है VARCHAR (320)। आपको शायद इसकी कभी आवश्यकता नहीं होगी, लेकिन यह सुरक्षित है, बस के मामले में।


4
सही सीमा 254 है। rfc-editor.org/errata_search.php?rfc=3696&eid=1690
नील

1

VARCHAR की कोई भी भिन्नता केवल आवश्यकतानुसार डेटा ब्लॉक में अधिक स्थान का उपयोग करती है। लंबाई को संग्रहीत करने के लिए अतिरिक्त बाइट्स उस स्थान की तुलना में तुच्छ हैं जो एक निश्चित-लंबाई वाले CHAR का उपयोग करके बर्बाद हो जाएंगे।

चूंकि VARCHAR कॉलम की लंबाई वास्तव में "अधिकतम लंबाई" है, इसलिए इसे किसी भी परिस्थिति में अधिकतम संभव लंबाई से बड़ा सेट किया जाना चाहिए। प्रत्येक पंक्ति की जरूरतों के लिए केवल उतनी ही जगह का उपयोग किया जाएगा। तब एप्लिकेशन प्रोग्राम को स्क्रॉलिंग फ़ील्ड या जो विशिष्ट मानों के आधार पर समझ में आता है, के साथ डिज़ाइन किया जाना चाहिए।

एक डेटाबेस डिजाइन कागज के एक भौतिक टुकड़े की तरह है कि यह आकार के रूप में कठिन सीमा निर्धारित करता है। एक पेपर पेज बड़ा नहीं किया जा सकता है। इस सादृश्य में, एप्लिकेशन प्रोग्राम पृष्ठ पर मुद्रित प्रपत्र की तरह है। बहुत कुछ है जो यह समायोजित करने के लिए किया जा सकता है कि हम फॉर्म में कितना डेटा पकड़ सकते हैं।

हालांकि वर्चहर आकार बढ़ाने की आज्ञा सरल दिख सकती है और एक छोटी सी मेज पर तुरंत चल सकती है, हजारों पंक्तियों या अधिक के साथ एक मेज पर ऐसा करने से संभवतः सभी डेटा और इंडेक्स ब्लॉकों को पुनर्जीवित करते हुए किसी प्रकार के डेटाबेस की आवश्यकता होती है। एक तरीका यह है कि बड़े कॉलम के साथ एक नई तालिका में सब कुछ कॉपी किया जाए। जो भी तकनीक का उपयोग किया जाता है, वह एक बड़े बालों वाली डील है। इस प्रकार, आपको एक उत्पादन तालिका लोड होने के बाद VARCHAR स्तंभ आकार पर काफी हद तक अपरिवर्तनीय विचार करना चाहिए।


1

पहले से ही यहाँ उत्कृष्ट जवाब के लिए एक टिप्पणी के रूप में:

सबसे पहले, यदि आपने फ़ील्ड बनाया है varchar(240)और आप बाद में इसे एक लंबे फ़ील्ड में बदलना चाहते हैं, तो कहें varchar(320), यह परिवर्तन डेटाबेस सर्वर पर एक तुच्छ ऑपरेशन होना चाहिए - यह, निश्चित रूप से, आपके डेटाबेस उत्पाद पर।

alter table Schema.Object alter column EmailAddress varchar(320) ;

दूसरा, औसत पंक्ति आकार और पृष्ठ आकार पर निर्भर करता है, varchar(320)इसके बजाय varchar(240)आवंटित पृष्ठों की संख्या (डिस्क स्थान वास्तव में तालिका द्वारा लिया गया) को बदल नहीं सकता है।

तीसरा, ऊपर किसी व्यक्ति ने ईमेल पते को मान्य करने की बात की। मैं तर्क देता हूं कि ईमेल पते को मान्य करने का केवल एक निश्चित तरीका है और वह है ईमेल को भेजना। :-)


0

ईमेल पतों के लिए उपयोग किया जाने वाला सबसे अच्छा डेटा प्रकार VARCHAR है क्योंकि ईमेल लंबाई द्वारा बहुत भिन्न होते हैं। NVARCHAR भी एक विकल्प है, लेकिन मैं इसका उपयोग केवल तभी करने की सलाह दूंगा जब ईमेल पते में विस्तारित वर्ण हों और ध्यान रखें कि इसे VARCHAR की तुलना में भंडारण स्थान की दोगुनी मात्रा की आवश्यकता होती है।

मेरे वातावरण में, हम varchar (70) को सबसे लंबे समय तक इस्तेमाल करते हैं, जो कि मेरे पास आया है, 60-70 char long के करीब हैं, लेकिन यह आपकी कंपनी के ग्राहक आधार पर भी निर्भर करता है। साथ ही, एक साइड-नोट के रूप में, सुनिश्चित करें कि आपके पास ईमेल पते की वैधता के लिए कुछ ईमेल सत्यापन चेक-इन हैं .. जैसे चेक बाधाओं या CHARINDEX का उपयोग करना


0

SQL का उपयोग करना DOMAIN

यदि आप किसी एंटरप्राइज़ डेटाबेस सर्वर का उपयोग कर रहे हैं, तो किसी ईमेल पते को DOMAINवैधता के कुछ स्तर के साथ स्टोर करने के लिए किसी प्रकार का होना चाहिए । डोमेन SQL विनिर्देशन में निर्दिष्ट हैं

एक डोमेन एक नामित उपयोगकर्ता-परिभाषित वस्तु है जिसे कुछ स्थानों पर डेटा प्रकार के विकल्प के रूप में निर्दिष्ट किया जा सकता है जहां एक डेटा प्रकार निर्दिष्ट किया जा सकता है। एक डोमेन में डेटा प्रकार, संभवतः एक डिफ़ॉल्ट विकल्प और शून्य या अधिक (डोमेन) की कमी होती है।

उदाहरण के लिए, मुक्त और खुला स्रोत PostgreSQL इसका समर्थन करता है, कल्पना के आपके कार्यान्वयन में किसी भी सीमा को रोकते हुए, कॉलम में स्वयं एक मान्य ईमेल होता है। आप उदाहरण के लिए कर सकते हैं ..

  • DOMAINHTML5 ईमेल की कल्पना पर एक कस्टम बनाएँ ।
  • या, RFC822, RFC2822, RFC5322 ईमेल की कल्पना पर।
  • एक कस्टम बनाएं DOMAINजो चेक के समय एमएक्स-रिकॉर्ड के लिए सर्वर की जांच करता है।

मैं इस उत्तर में इन विकल्पों का मूल्यांकन करता हूं जो कि PostgreSQL के लिए विशिष्ट है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.