SQL Server 2005 में फ़ोन नंबर संग्रहीत करने के लिए क्या डेटाटाइप का उपयोग किया जाना चाहिए?


85

मुझे एक तालिका में फ़ोन नंबर संग्रहीत करने की आवश्यकता है। कृपया सुझाव दें कि मुझे किस डायटाइप का उपयोग करना चाहिए? रुको। कृपया उत्तर देने से पहले पढ़ें।

इस क्षेत्र को भारी रूप से अनुक्रमित करने की आवश्यकता है क्योंकि बिक्री प्रतिनिधि खोज (जंगली चरित्र खोज सहित) के लिए इस क्षेत्र का उपयोग कर सकता है।

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

किसी भी सुझाव का स्वागत है ..

अद्यतन: मेरे पास स्रोत डेटा पर कोई नियंत्रण नहीं है। बस यह है कि xml फ़ाइल की संरचना मानक है। न्यूनतम करने के लिए xml पार्सिंग रखना चाहेंगे। एक बार जब यह डेटाबेस में होता है, तो पुनर्प्राप्ति शीघ्र होनी चाहिए। एक पागल सुझाव यहाँ के आसपास चल रहा है कि यह भी Ajax AutoComplete सुविधा के साथ काम करना चाहिए (ताकि बिक्री प्रतिनिधि तुरंत मिलान वाले देख सकते हैं)। हे भगवान!!


1
आप स्रोत डेटा के पार्सिंग / सफाई के लिए github.com/googlei18n/libphonenumber का उपयोग करना चाह सकते हैं ।
निकोलस हीरा

जवाबों:


60

क्या इसमें शामिल हैं:

  • इंटरनेशनल नंबर?
  • एक्सटेंशन?
  • वास्तविक संख्या के अलावा अन्य जानकारी (जैसे "बॉबी के लिए पूछें")?

यदि ये सभी नहीं हैं, तो मैं 10 चार फ़ील्ड का उपयोग करूंगा और सभी गैर-संख्यात्मक डेटा को बाहर निकालूंगा। यदि पहला हाँ है और अन्य दो नहीं हैं, तो मैं दो varchar (50) फ़ील्ड्स का उपयोग करूँगा, एक मूल इनपुट के लिए और दूसरा सभी गैर-न्यूमेरिक डेटा के साथ धारीदार और अनुक्रमण के लिए उपयोग किया जाएगा। यदि 2 या 3 हाँ हैं, तो मुझे लगता है कि मैं दो फ़ील्ड और कुछ प्रकार के पागल पार्सर करूँगा, यह निर्धारित करने के लिए कि विस्तार या अन्य डेटा क्या है और इसके साथ उचित व्यवहार करें। बेशक आप 2 कॉलम को इंडेक्स के साथ कुछ ऐसा करने से बचा सकते हैं जहां यह इंडेक्स बनाते समय अतिरिक्त वर्णों को अलग करता है, लेकिन मैं सिर्फ एक दूसरा कॉलम बनाऊंगा और शायद एक ट्रिगर के साथ वर्णों को अलग करना।

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


1
सभी सवालों के लिए हाँ। स्रोत डेटा पर मेरा कोई नियंत्रण नहीं है। वहाँ कुछ अच्छे सुझाव। धन्यवाद।
जॉन

13
नाइट-पिकिंग, लेकिन एक 10 चर क्षेत्र में अधिकांश यूके मोबाइल नंबर और कई यूके लैंड लाइन नंबर शामिल नहीं होंगे। अमेरिका में भी 10 से अधिक फोन नंबर के भविष्य के लिए अनुमति देने के लिए अनुमति देगा।
जॉन एगर्टन

2
decimal(10,0)इसके बजाय क्यों नहीं char?
श्री एंडरसन

1
@MrAnderson, मुझे लगता है कि क्योंकि decimal(10,0)जब भी आपको आवश्यकता होती है, तो आप को उस नंबर पर अग्रणी ज़ीरो को पैड करना होता है ..
मैथिज फ्लिएस्ट्रा

निर्भर करता है कि आप दुनिया में कहां हैं, मुझे नहीं लगता कि 10 अक्षर काफी लंबे हैं , जैसा कि ब्रैड के जवाब से भी उजागर होता है।
रिचर्डिसिमो

42

हम उस क्षेत्र पर varchar (15) और निश्चित रूप से सूचकांक का उपयोग करते हैं।

इसका कारण यह है कि अंतर्राष्ट्रीय मानक 15 अंकों तक का समर्थन कर सकते हैं

विकिपीडिया - टेलीफोन नंबर प्रारूप

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


2
मैं कुछ स्पष्ट देख सकता हूं, लेकिन संख्यात्मक डेटा को संग्रहीत करने के लिए वर्ण डेटा प्रकार का उपयोग करने में क्या लाभ है? और यदि आप संख्यात्मक डेटा (उदाहरण के लिए सीमांकक) से अधिक भंडारण कर रहे हैं, तो आपको प्रारूपित 15-अंकीय संख्या को संग्रहीत करने के लिए 15 से अधिक वर्णों की आवश्यकता नहीं होगी?
FtDRbwLXw6

13
@drrcknlsn कारण प्रमुख शून्य है - कुछ (कुछ देशों में सबसे) शून्य से शुरू होता है
Manse

16
@drrcknlsn मुझे पता है कि यह टिप्पणी 2 साल पुरानी है, लेकिन इस घटना में कि कोई भी आपकी टिप्पणी के पार आता है: आमतौर पर अंगूठे का नियम यह है कि पूर्णांक डेटा प्रकार का उपयोग संख्यात्मक डेटा को संग्रहीत करने के लिए किया जाना चाहिए जो गणित पर काम करने के लिए समझ में आता है, और बाकी तार हैं। उदाहरण के लिए, दो टेलीफोन नंबर जोड़ना, या SIN / SSN संख्याओं को गुणा करने का कोई मतलब नहीं है, इसलिए उन्हें स्ट्रिंग्स के रूप में संग्रहीत किया जाना चाहिए।
मार्को पिएत्रो सिरिलो

2
@drrcknlsn क्यों नहीं decimal(10,0)तो के बजाय char?
श्री एंडरसन

@ एमआर ए: हो सकता है क्योंकि फोन नंबर की लंबाई एक क्षेत्र / देश से दूसरे में भिन्न हो सकती है। अग्रणी शून्य के साथ भरना तब एक अतिरिक्त पार्सिंग समस्या पैदा करेगा।
ट्रंक

5

CHAR (10) का उपयोग करें यदि आप केवल यूएस फोन नंबर स्टोर कर रहे हैं। सब कुछ निकालें लेकिन अंक।


3

मैं शायद यहाँ स्पष्ट याद आ रही है, लेकिन अपने सबसे लंबे समय तक अपेक्षित फोन नंबर काम करने के लिए बस एक varchar पर्याप्त नहीं है?

मैं तो हूँ कुछ स्पष्ट याद आ रही है, मैं इसे प्यार करता हूँ अगर किसी को यह कहना होगा हूँ ...


3

मैं एक varchar (22) का उपयोग करेगा। विस्तार के साथ एक उत्तर अमेरिकी फोन नंबर रखने के लिए पर्याप्त है। आप सभी '(', ')', '-' वर्णों को अलग करना चाहते हैं, या उन सभी को एक समान प्रारूप में पार्स करना चाहते हैं।

एलेक्स


2

SQL सर्वर 2005 अनुक्रमणित varchar फ़ील्ड में पाठ के लिए क्वेरीज़ को प्रतिस्थापित करने के लिए बहुत अच्छी तरह से अनुकूलित है। 2005 के लिए उन्होंने सूचकांक क्षेत्रों के लिए स्ट्रिंग सारांश में नए आंकड़े पेश किए। यह पूर्ण पाठ खोज में महत्वपूर्ण मदद करता है।


2

वरचर का उपयोग करना काफी अक्षम है। पैसे के प्रकार का उपयोग करें और इसमें से एक उपयोगकर्ता घोषित प्रकार "फोननंबर" बनाएं, और केवल सकारात्मक संख्याओं की अनुमति देने के लिए एक नियम बनाएं।

यदि आप इसे (19,4) घोषित करते हैं, तो आप 4 अंकों के विस्तार को भी संग्रहीत कर सकते हैं और अंतर्राष्ट्रीय संख्याओं के लिए पर्याप्त हो सकते हैं, और केवल 9 बाइट्स का भंडारण करते हैं। इसके अलावा, सूचकांक तेजी से होते हैं।


2
Grats। -1। असंगतता और न पढ़ना - वाह्ट एबोट% 233% - पूर्ण तालिका स्कैन + रूपांतरण? यह एक मानक समस्या है और एक मानक समाधान है और यह संख्या नहीं है। जो सभी स्वरूपण, btw बाहर स्ट्रिप्स।
टॉमटॉ

@TomTom जब मैं सहमत हूं moneyतो इसका उत्तर नहीं है, यदि सबस्ट्रिंग द्वारा खोज की आवश्यकता नहीं है (और मुझे लगता है कि बहुतों को फोन नंबर के सिर्फ एक भाग के आधार पर रिकॉर्ड देखने की आवश्यकता नहीं है), तो उपयोग करने में क्या गलत होगा decimal(10,0)?
श्री एंडरसन

1

पूर्वगामी के साथ nvarchar जितना संभव हो उतना उन्हें मानकीकृत करने के लिए। आप शायद एक्सटेंशन निकालना चाहते हैं और उन्हें किसी अन्य फ़ील्ड में संग्रहीत कर सकते हैं।


1

डेटा को सामान्यीकृत करें और फिर एक varchar के रूप में संग्रहीत करें। सामान्य करना मुश्किल हो सकता है।

जो कि एक बार हिट होना चाहिए। फिर जैसे ही एक नया रिकॉर्ड आता है, आप इसकी तुलना सामान्यीकृत डेटा से करने लगते हैं। बहुत तेज होना चाहिए।


1

चूँकि आपको कई अलग-अलग फ़ोन नंबर स्वरूपों को समायोजित करने की आवश्यकता होती है (और शायद इसमें एक्सटेंशन आदि जैसी चीजें शामिल हैं), यह सबसे अधिक समझ में आता है कि आप इसे किसी भी अन्य संस्करण के रूप में मान सकते हैं। यदि आप इनपुट को नियंत्रित कर सकते हैं, तो आप डेटा को अधिक उपयोगी बनाने के लिए कई दृष्टिकोण अपना सकते हैं, लेकिन यह उस तरह से ध्वनि नहीं करता है।

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


1

जानकारी निकालने और संसाधित करने के लिए SSIS का उपयोग करें। इस तरह आप SQL सर्वर से अलग XML फ़ाइलों के प्रसंस्करण होगा। जरूरत पड़ने पर आप एक अलग सर्वर पर भी SSIS ट्रांसफॉर्मेशन कर सकते हैं। VARCHAR का उपयोग करके फोन नंबर को एक मानक प्रारूप में संग्रहीत करें। NVARCHAR अनावश्यक होगा क्योंकि हम संख्याओं और शायद कुछ अन्य वर्णों के बारे में बात कर रहे हैं, जैसे '+', '', '(', ')' और '-'।


1

varcharलंबाई प्रतिबंध वाले क्षेत्र का उपयोग करें ।


1

एक्सटेंशन को इंगित करने के लिए "x" या "ext" का उपयोग करना काफी आम है, इसलिए 15 वर्ण (पूर्ण अंतर्राष्ट्रीय समर्थन के लिए) प्लस 3 ("ext" के लिए) प्लस 4 (एक्सटेंशन के लिए) कुल 22 वर्णों को देने की अनुमति दें । जो आपको सुरक्षित रखे।

वैकल्पिक रूप से, इनपुट पर सामान्यीकृत करें ताकि कोई भी "एक्सट" का "एक्स" में अनुवाद हो जाए, अधिकतम 20 दे।


1

फोन नंबर जैसी बहु मूल्यवान विशेषताओं के लिए अलग-अलग टेबल रखना हमेशा बेहतर होता है।

जैसा कि आपके पास स्रोत डेटा पर कोई नियंत्रण नहीं है, इसलिए आप XML फ़ाइल से डेटा को पार्स कर सकते हैं और इसे उचित प्रारूप में बदल सकते हैं ताकि किसी विशेष देश के प्रारूपों के साथ कोई समस्या न हो और इसे एक अलग तालिका में संग्रहीत करें ताकि अनुक्रमण और पुनर्प्राप्ति दोनों कुशल होगी

धन्यवाद।


पूरी तरह से सवाल का जवाब नहीं है।
स्मार्ट मनोज

1

मुझे पता है कि यह धागा पुराना है, लेकिन यह प्रारूपण प्रयोजनों के लिए एक संख्यात्मक प्रकार के रूप में संग्रहीत करने के एक लाभ का उल्लेख करने के लायक है, विशेष रूप से .NET फ्रेमवर्क में।

अर्थात

.DefaultCellStyle.Format = "(###)###-####" // Will not work on a string


0

इसके बजाय डेटा प्रकार का लंबे समय तक उपयोग करें .. int का उपयोग न करें क्योंकि यह केवल -32,768 और 32,767 के बीच पूरे नंबर की अनुमति देता है, लेकिन यदि आप लंबे डेटा प्रकार का उपयोग करते हैं, तो आप -2,147,483,648 और 2,147,483,647 के बीच संख्या सम्मिलित कर सकते हैं।


1
यह ठीक है, लेकिन आप देश संख्याओं के साथ अंतर्राष्ट्रीय संख्याओं को संग्रहीत नहीं कर सकते क्योंकि कुछ संख्याएँ देश कोड के साथ शुरू होती हैं। Eg: 0094777123123, कुछ regex सत्यापन के साथ बेहतर varchar (15) फ़ील्ड का उपयोग करें।
बुब्शन_कुशन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.