फोन नंबर के लिए डेटाटाइप: VARCHAR, INT या BIGINT?


12

तो यह वर्ष का कठिन प्रश्न होगा, लेकिन मुझे यह पूछने की आवश्यकता है कि मैं पहली बार इससे नहीं गुजर रहा हूं। निम्नलिखित तालिका परिभाषा पर एक नज़र डालें:

यहाँ छवि विवरण दर्ज करें

स्तंभ पर एक नज़र डालें from_numberजो VARCHAR(45)अभी है लेकिन यह एक फ़ोन नंबर रखेगा। चूंकि मुझे नहीं पता है कि दुनिया भर में एक फोन कितने नंबर का हो सकता है और फिर मैं उनमें से लगभग सभी को कवर करने की कोशिश कर रहा हूं। मैं डेटाबेस की अखंडता को जितना संभव हो सके रखना चाहता हूं, इसलिए मुझे लगता VARCHARहै कि इस तरह की जानकारी रखने के लिए उचित प्रकार नहीं है - शायद मैं गलत हूं, आप मुझे बताएं - इसलिए मैं INTया तो बदलाव के बारे में सोच रहा हूं BIGINT

जब मैं कार्यक्षेत्र में एक कॉलम को परिभाषित कर रहा हूं, तो मुझे ()सभी मामलों में कोष्ठक के बीच की संख्या निर्दिष्ट करनी चाहिए , लेकिन उन में जो मैंने पिछले उल्लेख किया था। इसलिए अगर मैं ऐसा करता हूं: BIGINT()मुझे यह त्रुटि मिली:

यहाँ छवि विवरण दर्ज करें

जो मुझे इस MySQL प्रकार के बारे में थोड़ा पढ़ने के लिए मार्गदर्शन करता है । मूल रूप से जानकारी यह है:

एक बड़ा पूर्णांक। ... अहस्ताक्षरित सीमा 0 से 18446744073709551615 है।

जो मुझे पूछते हैं: जब मैं एक BIGINT()प्रकार को परिभाषित कर रहा हूं तो मुझे कोष्ठक के लिए क्या मूल्य निर्धारित करना चाहिए । (मैं BIGINT का उपयोग कर रहा हूं क्योंकि मुझे नहीं पता कि INT किसी फोन को अधिक से अधिक संख्या में पकड़ सकता है - शायद मैं भी गलत हूं)। MariaDB / MySQL डेटाबेस में एक कॉलम बनाने के लिए सही तरीका कौन सा है?

वैसे भी मैं आपकी राय, अनुभव जानना चाहूंगा और निश्चित रूप से मैं एक उत्तर प्राप्त करना चाहूंगा

नोट: मैं ईआर आरेख बनाने के लिए MySQL कार्यक्षेत्र नवीनतम संस्करण का उपयोग कर रहा हूं। मैं भी MariaDB 10.0.x का उपयोग कर रहा हूं


जवाबों:


13

आप एक्सटेंशन के साथ फ़ोन नंबर कैसे संभालेंगे, जैसे "+ 1-000-000-0000 ext 1234"?

ध्यान दें, "+" इंगित करता है कि अंतर्राष्ट्रीय डायलिंग नियमों को लागू किया जाना चाहिए; इसलिए उत्तरी अमेरिका से, सिस्टम स्वचालित रूप से अंतर्राष्ट्रीय कॉल आदि के सामने "011" जानता है।

इसके अलावा, "1-800-DBA-HELP" जैसे फोन नंबरों का क्या?

मैं आमतौर पर फोन नंबर को पाठ के रूप में संग्रहीत करता हूं। ऐसा कहने के बाद, यह वास्तव में निर्भर करता है कि आपका फ़ोन नंबर कॉलम कितना महत्वपूर्ण है। यदि आप उस कॉलम से स्वचालित डायलर चला रहे हैं, तो आप वास्तव में यह सुनिश्चित करना चाहते हैं कि केवल नंबर शामिल हैं, और डेटा अच्छी तरह से गठित फोन नंबर का प्रतिनिधित्व करता है।

आपके पास एक्सटेंशन के लिए अलग-अलग कॉलम हो सकते हैं, और फोन नंबर जिनके पास पाठ है, जैसे "1-800-डीबीए-हेल्प" उदाहरण मैंने प्रदान किया है।


हां, वे महत्वपूर्ण होंगे इसलिए मैं भविष्य में कोई गलती नहीं करूंगा, इसके आधार पर मैं केवल संख्या की अनुमति दूंगा, आपका सुझाव क्या है? एक नया कॉलम जोड़ना आसान है जो एक्सटेंशन नंबर को पकड़ता है या मैं लोगों को 1-800-DBA-HELPअंकों के रूप में दर्ज करना चाहता हूं जैसे कि यह अंक
ReynierPM

यह वास्तव में आपकी आवश्यकताओं पर निर्भर करता है। यदि आपको मानव-पहचान को बनाए रखने की आवश्यकता है, तो मैं निश्चित रूप से पाठ-आधारित संख्याओं को कहीं न कहीं, शायद एक पाठ क्षेत्र में रखना चाहूंगा। यदि आप पाठ भाग की परवाह नहीं करते हैं, तो उन्हें संग्रहीत न करें।
अधिकतम वर्नोन

1
अगर आप देश कोड के साथ पूर्ण संख्या को संग्रहीत करते हैं तो INT निश्चित रूप से बहुत बड़ा नहीं है। BIGINT शायद काफी बड़ा है।
मैक्स वर्नोन

1
मुझे कम से कम 20 अंक चाहिए।
मैक्स वर्नोन

1
MariaDB के साथ आप एक ऑटो-डायलर के लिए सिर्फ अंको को निकालने के लिए एक गणना क्षेत्र का उपयोग कर सकते हैं। शायद MySQL 5.7 में (निश्चित नहीं)।
13

2

पहले यह लिखा गया था:

"मारबीडीबी के साथ आप computedएक ऑटो-डायलर के लिए सिर्फ अंकों को निकालने के लिए एक फ़ील्ड का उपयोग कर सकते हैं । MySQL 5.7 के लिए भी काम करता है।"

इस बारे में ओपी के सवाल के जवाब में ("क्या आप मुझे समझा सकते हैं कि आप क्या बता रहे हैं?"), यहाँ एक स्पष्टीकरण है।

कई डेटाबेस सिस्टम ने अब यह सुविधा शुरू की है। ये ऐसे क्षेत्र हैं, जिन्हें " computed", " virtual" या " generated" के रूप में जाना जाता है , जो अन्य क्षेत्रों में मूल्यों से प्राप्त होते हैं। इस सुविधा की शक्ति आपके RDBMS के आधार पर अलग-अलग होगी। मुझे पता है कि Oracle, Firebird, MariaDB और अब MySQL 5.7 उनके पास है। दूसरे भी शायद करते हैं।

एक आसान उदाहरण एक उपनाम स्तंभ होगा और एक संगणित कॉलम होगा जो "स्टोर" करता है (याद रखें, वे आभासी हो सकते हैं - यानी मक्खी पर गणना की जाती है, या उन्हें डिस्क पर भौतिक रूप से संग्रहीत किया जा सकता है) उपनाम सभी राजधानियों के रूप में, जिससे बनाना आसान खोज। इस तरह से आपको केवल CAPs ( खोज , कहना LIKE) पर खोज करना है , यह जानकर कि डेटा [में खोजा जा रहा है [ computed| virtual| generated] फ़ील्ड बड़े अक्षरों में है।

MySQL 5.7 की अवधारणा को यहां और यहां बताया गया है । यह थोड़ी देर के लिए मारियाबीडी में रहा है और यहां अवधारणा को भी समझाया गया है । कुछ संभावित उपयोग यहां सुझाए गए हैं , लेकिन आप केवल अपनी कल्पना द्वारा सीमित हैं। उन्हें ट्रिगर के लिए एक सुविधाजनक (और कम त्रुटि-प्रवण) विकल्प के रूप में देखा जा सकता है।

आपके विशेष उपयोग के मामले में, आप एक टेक्स्ट फ़ील्ड "+" -> "00" (या जो भी आपका अंतर्राष्ट्रीय डायलिंग कोड है) से एक डायल करने योग्य संख्या प्राप्त कर सकते हैं। सिर्फ एक विचार।


महान, क्या आप कुछ प्रश्न जोड़कर अपने प्रश्न को थोड़ा सुधार सकते हैं? मेरा मतलब है कि मुझे अवधारणा मिल गई है लेकिन मुझे यकीन नहीं है कि कैसे virtualया generatedमूल्यों का निर्माण किया जाए । मैं उपयोग CONCATया कुछ और में सोच रहा हूं लेकिन निश्चित रूप से नहीं। इसके अलावा आप एक खोज का उल्लेख CAPSकरते हुए LIKEक्या आप इसका भी उदाहरण रख सकते हैं? मक्खी ( virtual) vs persisted (उत्पन्न`) पर गणना किए गए स्तंभों के प्रदर्शन के बारे में क्या ?
रेनियरपीएम

1

हम्म। फोन नंबर नंबर से बने होते हैं। Varchar का उपयोग करने से उपयोगकर्ता किसी भी प्रकार के फ़ॉर्मेटिंग को स्टोर करने की अनुमति देता है, (या नहीं, के साथ - या। और यह आपके डेटा के साथ जल्दी से गड़बड़ी पैदा करता है। एक फोन # प्रारूप "देश" पर निर्भर है, मास्क को देश से बांधा जाना चाहिए।) एक विस्तार है और वैकल्पिक है, इसलिए इसे "एक्सटेंशन फ़ील्ड" में संग्रहीत किया जाना चाहिए। (int भी)। 1-800-DBA-HELP के लिए, मैं इसे परिवर्तित कर दूंगा और वास्तविक संख्या को संग्रहीत करूंगा। यदि आपको वास्तव में इनकी आवश्यकता है। मानव पठनीय फोन #, इसे अलग-अलग varchar फ़ील्ड में संग्रहीत करें।


1

मैं आमतौर पर फोन नंबर को सरल पाठ में संग्रहीत करता हूं । स्वरूपण और प्रदर्शन इसे क्लाइंट कोड पर छोड़ देते हैं।

यहां, इससे अधिक, आप कैसे स्टोर करते हैं? आप उस फ़ोन नंबर के साथ क्या करने जा रहे हैं , वास्तव में महत्वपूर्ण है।

यदि आपका व्यवसाय आपके सिस्टम से आउटबाउंड कॉल करना चाहता है, तो एप्लिकेशन केवल नंबर निकालेगा। यदि आपका व्यवसाय अंतरराष्ट्रीय कॉल करना चाहता है , तो अलग कॉलम में देश कोड और क्षेत्र कोड संग्रहीत करें।

यदि आपका व्यवसाय रिपोर्टिंग के लिए चाहता है , तो एप्लिकेशन अलग-अलग एक्सटेंशन और नंबरों के साथ प्रारूपित और प्रदर्शित करेगा।

मेरी समझ से, फोन नंबर के लिए सार्वभौमिक डेटा मॉडल डिजाइन करना एक अच्छा विचार नहीं है। प्रत्येक देश में देश कोड के अलावा अलग-अलग संख्याएँ, एक्सटेंशन और क्षेत्र कोड होते हैं। इसके अलावा, मुझे पता चला, कुछ देशों में क्षेत्र कोड नहीं है।

यह आपके प्रश्न का उत्तर नहीं दे सकता है लेकिन यह हमारी समझ को व्यापक बनाने में मदद करेगा। धन्यवाद।

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