क्या डेटाबेस में टेक्स्ट कॉलमों पर वर्चर का उपयोग करने का कोई कारण है?


36

है varcharसिर्फ एक अवशेष से पहले textआसपास आया था, या ऐसे मामलों में जहां आप हैं वहाँ का उपयोग कर रहे हैं चाहते हैं एक का उपयोग करने के varchar? (या charउस बात के लिए ..)

(मैं Postgres और MySQL (MyISAM) का दैनिक उपयोग करता हूं, इसलिए वे हैं जो मैं सबसे अधिक रुचि रखता हूं, लेकिन अन्य डेटाबेस के उत्तर निश्चित रूप से स्वागत योग्य हैं। ^ _-)


6
कम से कम SQL सर्वर के लिए , textपदावनत किया जाता है। उपयोग के विचार भी हैं जो डेटा को संग्रहीत करने से संबंधित हैं और यह कैसे एक्सेस किया जाता है।
19/07 को O

कुछ DBMS पर आप किसी सॉर्ट या क्लॉज़ में टेक्स्ट कॉलम का उपयोग करने में सक्षम नहीं हो सकते हैं। मैं Postgres से परिचित नहीं हूँ, लेकिन अपने प्रलेखन की जाँच करें।
jaa

1
यह StackOverflow प्रश्न कुछ और जानकारी प्रदान कर सकता है।
J0ANMM

जवाबों:


32

सामान्य रूप में

textकॉलम गैर मानक और कार्यान्वयन विशिष्ट हैं। कई मामलों में, डेटाबेस के आधार पर उनके पास निम्नलिखित प्रतिबंधों में से एक या अधिक का संयोजन हो सकता है: अनुक्रमित नहीं , खोज योग्य नहीं और छांटने योग्य नहीं

पोस्टग्रेज में

इन सभी प्रकारों को समान सी डेटा संरचना का उपयोग करके आंतरिक रूप से सहेजा जाता है।

MySQL में

textस्तंभ की एक विशेष संस्करण हैBLOB और अनुक्रमण पर प्रतिबंध है।

बस इन दो उदाहरणों को अन्य SQL RDBMS सिस्टम के लिए एक्सट्रपलेशन किया जा सकता है और दूसरे पर एक प्रकार चुनने के लिए समझने के लिए पर्याप्त कारण होना चाहिए।

बस इसे स्पष्ट रूप से स्पष्ट करने के लिए, आपको कभी भी इसका उपयोग नहीं करना चाहिए TEXTक्योंकि यह मालिकाना और गैर-मानक है। जो भी SQLआप इसके खिलाफ लिखते हैं, वह पोर्टेबल नहीं होगा और भविष्य में आपको समस्याओं का कारण बनने की गारंटी देगा। केवल उन प्रकारों का उपयोग करें जो ANSI मानक का हिस्सा हैं ।

  • उपयोग करें CHARजब आप जानते हैं कि आपके पास हर प्रविष्टि के लिए निश्चित संख्या में वर्ण हैं।
  • VARCHARजब आपके पास हर प्रविष्टि के लिए वर्णों की एक चर संख्या हो, तो उसका उपयोग करें ।
  • यदि आपको एन्कोडिंग या समकक्ष मानक प्रकार के साथ अधिक संग्रहण की आवश्यकता VARCHARहो, तो ।CLOBUTF-8
  • कभी भी उपयोग न करें TEXTक्योंकि यह गैर-मानक है।

1
के लिए स्वीकृत non standard and implementation specificऔर not indexable, not searchable and not sortable, जिसका मुझे एहसास नहीं था। मैं प्रभावित text था मानकीकृत।
इज़काता

1
क्या आपका मतलब है ASCII textमानक या UNICODE textमानक :-) या अन्य आधा दर्जन textएन्कोडिंग मानकों में से एक?

1
यदि आप SQL मानकों के दस्तावेजों के माध्यम से खुदाई करते हैं, तो मुझे नहीं लगता कि आप textएक चरित्र प्रकार के बारे में कुछ भी पाएंगे । मैंने कुछ भी नहीं देखा है, कुछ विक्रेताओं ने इसे कॉल किया long charऔर इसे पसंद किया, यह मूल रूप से एक BLOB है जो इसके साथ संलग्न एन्कोडिंग के साथ है।

2
@JarrodRoberson ईमानदार होने के लिए बहुत सारे प्रतिष्ठित संसाधन हैं जो निष्कर्ष निकालते हैं (जब पोस्टग्रैज वातावरण में होते हैं) जो "हमेशा उपयोग करते हैं TEXT"। यदि आप किसी भिन्न डेटाबेस में माइग्रेट करने जा रहे हैं, तो यह मुश्किल से एक सौदा ब्रेकर है, खासकर जब से आपको यह विचार करना होगा कि पोस्टग्रैब्स का असीमित VARCHAR(टोस्ट के कारण माईएसक्यूएल के साथ उदाहरण के लिए कोई पंक्ति सीमा नहीं है) असीमित VARCHARमें अनुवाद नहीं हो सकता है अन्य डेटाबेस वैसे भी।
कयामन

1
... और जैसा कि Postgres CLOB का समर्थन नहीं करता है , दूसरे से अंतिम बिंदु तक पकड़ नहीं है। यदि आप मानक का पालन कर रहे हैं तो भी आप ड्रॉप-इन प्रतिस्थापन का समर्थन करने में सक्षम नहीं होंगे । जब तक आप खिलौना एसक्यूएल नहीं लिख रहे हैं, तब तक एएनएसआई एसक्यूएल लिखना वास्तविक दुनिया में एक व्यवहार्य विकल्प नहीं है।
कायममन

11

text, varcharऔर charसभी अलग-अलग कारणों से उपयोग किए जाते हैं। पाठ्यक्रम कार्यान्वयन अंतर (वे कितना आकार लेते हैं .. आदि) हैं, लेकिन उपयोग और इरादा विचार भी हैं। आप किस प्रकार का उपयोग करते हैं, यह आपको उस डेटा के प्रकार के बारे में कुछ बताता है जो इसमें संग्रहीत किया जाएगा (या हम सब कुछ केtext लिए उपयोग करेंगे )। यदि किसी चीज की निश्चित लंबाई है, तो हम उपयोग करते हैं । यदि इसकी एक अच्छी तरह से परिभाषित ऊपरी सीमा के साथ चर लंबाई है तो उपयोग करें । यदि यह पाठ का एक बड़ा हिस्सा है, जिस पर आपका थोड़ा नियंत्रण है, तो शायद आपका सबसे अच्छा दांव होगा।charvarchartext


3
Sooooooo, एकमात्र वास्तविक अंतर सीमा-जाँच की नकल करना है जो शायद वैसे भी प्रोग्राम कोड में होना चाहिए?
इजाकाता

2
@ इज़्काता - कार्यान्वयन अंतर भी हैं। यह सीमा जाँच के बारे में नहीं है, इसके बारे में डेटा प्रकार । A (US) ज़िप कोड हमेशा 5 अंकों का कोड होता है, इसलिए 'char' जैसी किसी चीज़ का उपयोग करना डेटा के इस टुकड़े की परिभाषा का हिस्सा बन जाता है। अगर यह केवल बाउंड चेकिंग जैसा सामान था तो हम सब कुछ के लिए सिर्फ एक डेटा टाइप का उपयोग कर सकते हैं और अपनी चेकिंग और कास्टिंग कोड साइड कर सकते हैं।
सिस्टम डाउन

6
@SystemDown जहां तक मुझे पता है, char, varchar, और textसभी एक ही भंडारण के लिए तैयार कर रहे हैं प्रकार डेटा की। तो यहाँ दोनों उत्तर सीमा जाँच के बारे में हैं। यदि दक्षता अंतर हैं, तो वे क्या हैं? मैं क्यों प्रयोग करेंगे varcharसे अधिक text?
इजाकाटा

1
फ्लोट और डबल का उपयोग एक ही प्रकार के डेटा के लिए भी किया जाता है, फिर भी उनके बीच मतभेद होते हैं और अलग-अलग तरीके से उपयोग किए जाते हैं। कार्यान्वयन के अंतर के रूप में, मैं पोस्टग्रेज के साथ पर्याप्त रूप से परिचित नहीं हूं ताकि यह जवाब दे सकूं कि मुझे डर है।
सिस्टम डाउन

4
@SystemDown हालांकि पोस्टल कोड को चार (5) के रूप में संग्रहीत करना आपको काट सकता है यदि आप अंतर्राष्ट्रीयकरण शुरू करते हैं। यूके पोस्ट कोड लंबाई में भिन्न होते हैं और 5 वर्ण लगभग पर्याप्त नहीं होते हैं। मुझे नहीं पता कि यूके पोस्ट कोड में जगह पार्सिंग के लिए प्रासंगिक है, हालांकि।
वैटाइन

5

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

लेकिन जैसे-जैसे कंप्यूटर तेजी से बढ़ते हैं और अधिक मेमोरी प्राप्त करते हैं, लोग अपने डेटाबेस में अधिक डेटा डालते हैं और कट्टर सवाल करते हैं। एक डेटाबेस के लिए सीपीयू और मेमोरी आज के रूप में सीमित हैं क्योंकि वे 64Kb मुख्य मेमोरी और 10Mb हार्ड ड्राइव ( मेनफ्रेम कंप्यूटर पर) के दिनों में थे ।

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

के रूप में अन्य उत्तर में बताया गया है, उपयोग charकरता है, तो यह हमेशा पात्रों की एक निश्चित संख्या का उपयोग करता है varchar, तो लंबाई भिन्न हो सकते हैं, लेकिन यह बहुत बड़ी नहीं मिलता है (मेरे अनुमान है सबसे डीबी के एक के रूप में यह इलाज charया textआकार पर निर्भर करता है), और textअगर यह कोई भी लंबाई हो सकती है। अपने एसक्यूएल प्रयास करता है उपयोग करने के लिए, तो textस्तंभ है, यह सबसे अच्छा होगा यह किसी भी तरह संक्षिप्त और एक में रख सकता है charया छोटे varcharस्तंभ भी है, तो कर whereके और order by'उस पर है। बेशक, यह केवल अगर प्रदर्शन आपके लिए मायने रखता है।

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