वर्चर (अधिकतम) 8000 कॉलम को समझना और मैं इसमें 8000 से अधिक वर्णों को क्यों संग्रहीत कर सकता हूं


13

से इस माइक्रोसॉफ्ट दस्तावेज़, +

n स्ट्रिंग की लंबाई को परिभाषित करता है और 8,000 के माध्यम से 1 से मान हो सकता है। अधिकतम इंगित करता है कि अधिकतम भंडारण आकार 2 ^ 31-1 बाइट्स (2 जीबी) है। भंडारण आकार डेटा की वास्तविक लंबाई है + 2 बाइट्स।

कृपया इसे समझने में मेरी मदद करें।

वर्चर के लिए अधिकतम वर्ण प्रतीत होते हैं 8000, जो 2GBडेटा के मूल्य से कम है ।

मैं देखता हूं कि varchar(max)एक विशिष्ट तालिका के इस कॉलम में रिकॉर्ड हैं len(mycolumn)> 100 000। इस प्रकार मुझे पता है कि मैं 8000एक varchar(max)कॉलम में वर्णों से अधिक रास्ता प्राप्त कर सकता हूं ।

प्रश्न 1:8000 पात्र कैसे निभाते हैं और मुझे इसके बारे में कहाँ पता होना चाहिए?

प्रश्न 2 : क्या इस कॉलम में .net डेटरीडर क्वेरी हमेशा 100 000+ वर्ण के साथ पूर्ण परिणाम देगा?


ध्यान दें कि varchar(max)एक बार बुलाया textगया था और एक अलग डेटा प्रकार के रूप में व्यवहार किया गया था।
श्री लिस्टर

शायद यह पढ़ा ? इसके 8K पृष्ठ आकार से संबंधित है। एकल पृष्ठ में फिट होने के लिए बहुत बड़ा मान (सीमा वास्तव में 8000 से थोड़ी बड़ी है) LOB_DATA पृष्ठों (बड़े OBject) में सहेजे जाते हैं।
जस्टिन

जवाबों:


30

मैं देख सकता हूँ कि आप इसे गलत क्यों समझ रहे हैं - यह थोड़ा मुश्किल है। ये सभी मान्य हैं:

  • VARCHAR (1) - एक वर्ण स्ट्रिंग
  • VARCHAR (4000) - 4,000 वर्ण
  • VARCHAR (8000) - 8,000 वर्ण - और यदि आप इस क्षेत्र की परिभाषा के लिए किसी संख्या का उपयोग करते हैं, तो वह उच्चतम संख्या है जिसका आप उपयोग कर सकते हैं, लेकिन इसे देखें:
  • VARCHAR (MAX) - जो 2GB तक का है।

और हां, अगर आप VARCHAR (MAX) फ़ील्ड से डेटा प्राप्त करने का प्रयास करते हैं, और किसी ने वहां 2GB संग्रहीत किया है, तो बकसुआ करें।


3
and somebody stored 2GB in there, buckle up.- वहाँ कुछ बूँद फ़ाइलों के साथ किया गया
रुस्लान

7

प्रश्न १: come००० अक्षर कैसे निभाते हैं और मुझे इसकी जानकारी कहाँ होनी चाहिए?

N को 8000 में सेट करने से 8000 अक्षर खेलने में आते हैं। आपको चार, नर्चर, नवरचेयर और वर्चर के बारे में सटीक, स्केल और लंबाई (लेन-देन-एसक्यूएल) संदर्भों के बारे में पता होना चाहिए । इसके विपरीत, n से अधिकतम (कोई उद्धरण नहीं) सेट करने से SQL सर्वर स्टोर हो जाता है (और वापस आ जाता है) बाइट्स की अधिकतम संख्या (जैसा कि आपके उद्धरण में वर्णित है)।

प्रश्न 2: क्या इस कॉलम में .net डेटरीडर क्वेरी हमेशा 100 000+ वर्ण के साथ पूर्ण परिणाम देगा?

यह एक .Net (SQL सर्वर नहीं) प्रश्न है, लेकिन .Net डेटाट्रेडर बाइट्स की एक धारा प्राप्त करता है। एक बाइट एक वर्ण नहीं है, और SQL सर्वर बाइट्स (वर्ण नहीं) देता है। यदि n को 8000 पर सेट किया गया है और डेटा प्रकार nvarchar है, तो SQL Server 8000 बाइट्स तक लौटता है, जो .Net डेटाट्रेडर 4000 यूनिकोड वर्णों की व्याख्या कर सकता है। यदि n 8000 पर सेट है और डेटा प्रकार varchar है, तो SQL Server 8000 बाइट्स तक लौटता है, जो .Net डेटाट्रेडर 8000 ANSI वर्णों की व्याख्या कर सकता है। यदि n अधिकतम पर सेट है और डेटा प्रकार nvarchar है, तो SQL Server 2 ^ 31-1 बाइट्स तक वापस आ जाता है, जिसे .Net डेटारीडर अप करने के लिए (2 ^ 31-1) / 2 वर्णों तक व्याख्या कर सकता है। यदि n अधिकतम पर सेट है और डेटा प्रकार varchar है, तो SQL Server 2 ^ 31-1 बाइट्स तक लौटता है, जो .Net डेटाट्रेडर 2 ^ 31-1 ANSI वर्णों तक की व्याख्या कर सकता है।

यदि आप चार या वर्चर (nchar या nvarchar के बजाय) का उपयोग करते हैं, क्योंकि वे अधिक "वर्ण" (अधिक सटीक: बाइट्स) संग्रहीत कर सकते हैं, तो आपको यह जानना होगा कि कई यूनिकोड वर्णों में कोई समान ANSI वर्ण नहीं है (इस प्रकार हमारा एक बड़ा भाग) दुनिया के उपयोगकर्ता आपके ऐप में अपने स्थानीयकृत / मूल वर्णों को देखने में असमर्थ होंगे)।

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