2008-10-06 22 views

उत्तर

693

बस स्पष्ट करने के लिए ... या योग ...

  • nchar और nvarcharयूनिकोड पात्रों स्टोर कर सकते हैं।
  • char और varcharयूनिकोड पात्रों की दुकान नहीं कर सकते हैं।
  • char और ncharनिश्चित लंबाई जो वर्णों की संख्या के लिए आरक्षित भंडारण स्थान आप भले ही आप सब है कि अंतरिक्ष का उपयोग नहीं करते निर्दिष्ट करेगा कर रहे हैं।
  • varchar और nvarcharचर लंबाई जो केवल वे वर्ण जो आप की दुकान के लिए रिक्त स्थान का उपयोग करेगा कर रहे हैं। यह भंडारण आरक्षित नहीं करेगा जैसे char या nchar

nchar और nvarchar दुगनी हो जाती संग्रहण स्थान ले जाएगा, तो यह उन्हें इस्तेमाल करने के लिए आप यूनिकोड समर्थन की जरूरत ही अगर बुद्धिमान हो सकता है।

+13

char और varchar स्टोर करने के लिए नहीं हैं यूनिकोड, लेकिन कुछ अतिरिक्त कोडिंग चाल और अतिरिक्त तर्क के साथ, आप अभी भी यूनिकोड स्टोरेज के लिए एक [var] char फ़ील्ड का दुरुपयोग कर सकते हैं। –

+8

यह टक्कर निर्भर है कि 'n ... 'संस्करण दो गुना अधिक संग्रहण स्थान लेते हैं [जैसा कि मेरा उत्तर दिखाता है] (http://stackoverflow.com/q/8250586/73226) –

+3

आरक्षित करने का क्या फायदा है भंडारण? – mlissner

33

nchar और चार काफी, एक दूसरे के रूप में ठीक उसी तरह में संचालित किए जाते है nvarchar और varchar है। उनके बीच एकमात्र अंतर यह है कि vcharar नहीं करता है, जबकि nchar/nvarchar स्टोर यूनिकोड वर्ण (आवश्यक यदि आपको विस्तारित चरित्र सेट के उपयोग की आवश्यकता होती है)।

क्योंकि यूनिकोड वर्णों को अधिक संग्रहण की आवश्यकता होती है, nchar/nvarchar फ़ील्ड दो गुना अधिक स्थान लेते हैं (उदाहरण के लिए SQL सर्वर के पुराने संस्करणों में उदाहरण के लिए nvarchar फ़ील्ड का अधिकतम आकार 4000 है)।

यह सवाल this one का डुप्लिकेट है।

+3

आप एक चीज़ भूल जाते हैं: nchar एक निश्चित लंबाई का उपयोग करता है इसलिए nchar (10) को हमेशा दस वर्ण प्राप्त करने की आवश्यकता होती है। और वर्कर (10) वास्तव में यूनिकोड है और 10 अक्षरों तक, वर्णों की किसी भी संख्या को स्वीकार करेगा। यह भी देखें http://msdn.microsoft.com/en-us/library/ms186939.aspx –

5

nchar (10) लंबाई की एक निश्चित लंबाई वाली यूनिकोड स्ट्रिंग है 10. nvarchar (10) एक चर-लंबाई वाली यूनिकोड स्ट्रिंग है जो अधिकतम लंबाई 10 है। आम तौर पर, यदि आप सभी डेटा मान 10 हैं तो आप पूर्व का उपयोग करेंगे वर्ण और बाद वाले यदि लंबाई भिन्न होती है।

+0

गलत तुलना - प्रश्न nchar और varchar से संबंधित है, नचर और nvarchar नहीं। –

1

NVARCHAR यूनिकोड वर्णों को स्टोर कर सकता है और प्रति चरित्र 2 बाइट ले सकता है।

+1

गलत! यूनिकोड प्रति चरित्र 1 और 4 बाइट्स के बीच उपयोग करता है! बहुत से लोग इसे भूल जाते हैं! यहां तक ​​कि यूटीएफ -16 के उपयोग के परिणामस्वरूप कुछ पात्र 2 के बजाय 4 बाइट ले सकते हैं, हालांकि सामान्य लंबाई 2 बाइट्स होगी। यूनिकोड के कुछ अन्य सबफॉर्मैट्स 4 बाइट से भी अधिक ले सकते हैं! –

+7

@WimtenBrink - प्रश्न SQL सर्वर के बारे में है और 'nvarchar' हमेशा प्रति अक्षर 2 बाइट लेता है। –

+0

@Wim, आप सही हैं यूनिकोड के लिए कई एन्कोडिंग हैं जो बाइट्स की एक अलग संख्या उत्पन्न कर सकते हैं। लेकिन SQL सर्वर आपको यूनिकोड एन्कोडिंग के बारे में कोई विकल्प नहीं देता है। 2012 से पहले एसक्यूएल सर्वर केवल यूसीएस -2, दो बाइट चौड़ा इस्तेमाल करता था, इसलिए मार्टिन उस वक्त सही था जब उसने जवाब लिखा था। जैसा कि ऊपर दिए गए अन्य उत्तरों ने कहा है, एसक्यूएल सर्वर 2012 अब यूटीएफ -16 प्रदान करता है, इसलिए कई पात्रों के लिए दो बाइट्स (यूनिकोड बेसिक बहुभाषी विमान में), दूसरों के लिए चार बाइट्स। –

4
  • nchar निश्चित लंबाई है और यूनिकोड वर्ण रख सकता है। यह प्रति चरित्र दो बाइट स्टोरेज का उपयोग करता है।

  • varchar चर लंबाई का है और यूनिकोड वर्ण को रोक नहीं सकते। यह प्रति चरित्र एक बाइट भंडारण का उपयोग करता है।

+0

गलत। यूनिकोड प्रत्येक चरित्र के लिए 1 से 4 बाइट्स (सामान्य रूप से) का उपयोग कर सकता है। इसके अलावा, एक वर्कर यूनिकोड पकड़ सकता है, लेकिन इसे यूनिकोड के रूप में पहचाना नहीं जाता है। नतीजतन, एक वर्चर यूनिकोड भंडारण के लिए अविश्वसनीय माना जाता है। (विशेष रूप से क्योंकि जोखिम है कि फ़ील्ड तक पहुंचने वाला कोड गलत तरीके से इसका अनुवाद करेगा।) –

+0

@Alex: मुझे लगता है कि आपने अपना मुद्दा बनाया है लेकिन मैं अभी भी आपसे सहमत नहीं हूं। आप जो कह रहे हैं वह यह है कि यदि कोई लंबा 2^32 से छोटा होता है तो एक int लंबा हो सकता है। यह केवल 'अविश्वसनीय' नहीं है, यह एक अंतर्निहित सीमा है जो पूरे मूल्य सीमा को कवर करना असंभव बनाता है। – Manu

+4

@ वर्कशॉप एलेक्स: गलत। यूनिकोड को 'यूसीएस -2' के रूप में एन्कोड किया गया है (जो एसक्यूएल सर्वर द्वारा उपयोग किया जाने वाला एन्कोडिंग होता है) प्रत्येक चरित्र को * बिल्कुल * दो बाइट्स में संग्रहीत करता है, http://msdn.microsoft.com/en-us/library/bb330962%28v देखें = sql.90% 29.aspx: 'एसक्यूएल सर्वर यूसीएस -2 एन्कोडिंग योजना में यूनिकोड स्टोर करता है ... यूसीएस -2 एक निश्चित-लंबाई एन्कोडिंग है जो सभी वर्णों को 16-बिट मान (2 बाइट्स) के रूप में दर्शाता है। एसक्यूएल सर्वर 2008 एससीएसयू संपीड़न का उपयोग कर सकता है, लेकिन अभी भी यूसीएस -2 एन्कोडेड यूनिकोड स्ट्रिंग का संपीड़न है: http://msdn.microsoft.com/en-us/library/ee240835.aspx –

7

nchar nvarchar से अधिक स्थान की आवश्यकता है।

जैसे,

एक चार (100) हमेशा 100 अक्षरों की दुकान भले ही आप केवल 5 में प्रवेश करेंगे, शेष 95 वर्ण रिक्तियों के साथ गद्देदार कर दिया जाएगा। एक वर्चर (100) में 5 वर्ण संग्रहीत करने से 5 वर्ण सहेजे जाएंगे।

+4

पूरी तरह से सच नहीं है, क्योंकि आपको 100 अक्षरों के साथ एक char (100) भरना होगा। आप इसका उपयोग तब करेंगे जब आप अपने डेटाबेस में स्टोर फोन नंबर, या निश्चित लंबाई के साथ ऑर्डर नंबर हैं। क्योंकि फ़ील्ड की लंबाई तय की गई है, इसलिए आपके पास इसे अधिकतम वर्णों तक भरने का कोई विकल्प नहीं है। लेकिन जब आपका सभी डेटा प्रति रिकॉर्ड 100 वर्ण होता है, तो एक char (100) एक वर्चर (100) से कम संग्रहण लेगा क्योंकि इसे लंबाई संकेत की आवश्यकता नहीं है: प्रत्येक मान बिल्कुल 100 वर्ण होंगे। –

14
  • char: अधिकतम लंबाई 8000 वर्णों के साथ निश्चित लंबाई वर्ण डेटा।
  • nchar: अधिकतम लंबाई 4000 वर्णों के साथ निश्चित लंबाई वाले यूनिकोड डेटा।
  • Char = 8 बिट लंबाई
  • NChar = 16 बिट लंबाई
7

The differences हैं:

  1. n [वर] चार दुकानों यूनिकोड जबकि [वर] चार सिर्फ सिंगल-बाइट वर्ण संग्रहीत करता है।
  2. [n] char को सटीक लंबाई के वर्णों की एक निश्चित संख्या की आवश्यकता होती है जबकि [n] वर्कर परिभाषित लंबाई तक वर्णों की एक चर संख्या को स्वीकार करता है।

एक और अंतर लंबाई है। नचर और nvarchar दोनों 4,000 वर्ण लंबा हो सकता है। और चार और वर्कर लंबे समय तक 8000 वर्ण तक हो सकते हैं। लेकिन SQL सर्वर के लिए आप एक [n] वर्कर (अधिकतम) का भी उपयोग कर सकते हैं जो 2,147,483,648 वर्णों को संभाल सकता है। आंकड़ों के पीछे चल जोड़ता रिक्त स्थान - nchar: (। दो गीगाबाइट, एक हस्ताक्षरित 4 बाइट पूर्णांक)

30

बस कुछ और जोड़ने के लिए। nvarchar - डेटा में पिछली जगहों को जोड़ता नहीं है।

तो, यदि आप अपने डेटासेट को 'nchar' फ़ील्ड द्वारा फ़िल्टर करने जा रहे हैं, तो आप रिक्त स्थान को हटाने के लिए RTRIM का उपयोग करना चाह सकते हैं। ईजी। नचर (10) ब्रैंड नामक फ़ील्ड एनआईकेई शब्द संग्रहित करता है। यह शब्द के दाईं ओर 6 रिक्त स्थान जोड़ता है। तो, जब छानने, अभिव्यक्ति पढ़ना चाहिए: RTRIM (! फील्ड्स BRAND.Value) = "Nike"

आशा इस कोई वहाँ बाहर में मदद करता है क्योंकि मैं थोड़ा के लिए इसके साथ संघर्ष कर रहा था अभी!

76

सभी उत्तरों अब तक इंगित करते हैं कि varchar एकल बाइट है, nvarchar डबल बाइट है। वास्तव में नीचे वर्णित depends on collation का पहला भाग।

DECLARE @T TABLE 
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS, 
C2 NVARCHAR(20)COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS 
) 

INSERT INTO @T 
    VALUES (N'中华人民共和国',N'中华人民共和国'), 
      (N'abc',N'abc'); 

SELECT C1, 
     C2, 
     LEN(C1)  AS [LEN(C1)], 
     DATALENGTH(C1) AS [DATALENGTH(C1)], 
     LEN(C2)  AS [LEN(C2)], 
     DATALENGTH(C2) AS [DATALENGTH(C2)] 
FROM @T 

रिटर्न

enter image description here

ध्यान दें कि और पात्रों अभी भी VARCHAR संस्करण में प्रतिनिधित्व नहीं कर रहे थे और चुपचाप ? साथ प्रतिस्थापित किया गया।

वास्तव में अभी भी कोई चीनी वर्ण नहीं है जिसे उस संयोजन में एक बाइट द्वारा दोहराया जा सकता है। एकमात्र एकल बाइट वर्ण सामान्य पश्चिमी ASCII सेट हैं।

इस वजह से nvarchar(X) कॉलम से varchar(X) कॉलम to fail with a truncation error पर एक डालने के लिए संभव है (जहां एक्स दोनों उदाहरणों में एक संख्या दर्शाता है)।

एसक्यूएल सर्वर 2012 एससी (पूरक कैरेक्टर) कॉलेशन जो UTF-16 का समर्थन करता है जोड़ता है। इन collations में एक nvarchar चरित्र 2 या 4 बाइट ले सकता है।

19

संक्षिप्त और मौजूदा जवाब सही करने के लिए मेरे प्रयास:

पहले, char और nchar हमेशा भंडारण स्थान की एक निश्चित राशि, का उपयोग करेगा तब भी जब स्ट्रिंग संग्रहीत करने के लिए उपलब्ध स्थान से छोटा होता है, जबकि varchar और nvarchar उस स्ट्रिंग को स्टोर करने के लिए आवश्यक स्टोरेज स्पेस का उपयोग करेगा (प्लस ओवरहेड के दो बाइट्स, संभावित रूप से स्ट्रिंग लम्बाई को स्टोर करने के लिए)। तो याद रखें, "var" का अर्थ है "चर", परिवर्तनीय स्थान के रूप में।

दूसरे प्रमुख बिंदु यह समझना होगा कि, चरित्र प्रति बिल्कुल दो बाइट्स का उपयोग कर nchar और nvarchar दुकान तार, जबकि char और varchar मिलान कोड पेज द्वारा निर्धारित एन्कोडिंग, जो आमतौर पर वास्तव में एक बाइट हो होगा का उपयोग करें प्रति चरित्र (हालांकि अपवाद हैं, नीचे देखें)। प्रति चरित्र दो बाइट्स का उपयोग करके, वर्णों की एक विस्तृत श्रृंखला को संग्रहीत किया जा सकता है, इसलिए यहां याद रखने की मूल बात यह है कि nchar और nvarchar अंतर्राष्ट्रीयकरण समर्थन चाहते हैं, जो आप संभवतः एक बेहतर विकल्प बनते हैं।

अब कुछ बेहतर अंक के लिए।

पहले, nchar और nvarchar कॉलम हमेशा दुकान यूसीएस -2 का उपयोग कर डेटा। इसका मतलब है कि प्रति चरित्र बिल्कुल दो बाइट्स का उपयोग किया जाएगा, और बेसिक बहुभाषी प्लेन (बीएमपी) में कोई यूनिकोड चरित्र nchar या nvarchar फ़ील्ड द्वारा संग्रहीत किया जा सकता है। हालांकि, ऐसा नहीं है कि कोई भी यूनिकोड चरित्र संग्रहीत किया जा सकता है। उदाहरण के लिए, विकिपीडिया के अनुसार, मिस्र के हाइरोग्लिफ के लिए कोड बिंदु बीएमपी के बाहर गिरते हैं। ऐसे में, यूनिकोड स्ट्रिंग्स का प्रतिनिधित्व किया जा सकता है जिन्हें यूटीएफ -8 और अन्य सच्चे यूनिकोड एन्कोडिंग में प्रदर्शित किया जा सकता है जिन्हें SQL सर्वर nchar या nvarchar फ़ील्ड में संग्रहीत नहीं किया जा सकता है, और मिस्र के हाइरोग्लिफ में लिखे गए तार उनके बीच होंगे। सौभाग्य से आपके उपयोगकर्ता शायद उस स्क्रिप्ट में नहीं लिखते हैं, लेकिन यह ध्यान में रखना कुछ है!

एक और भ्रामक लेकिन दिलचस्प बात यह है कि अन्य पोस्टर पर प्रकाश डाला है कि char और varchar क्षेत्रों कुछ वर्णों के लिए चरित्र प्रति दो बाइट्स का उपयोग कर सकते मिलान कोड पेज लिए ऐसा करना आवश्यक है, तो है। (मार्टिन स्मिथ एक उत्कृष्ट उदाहरण है जिसमें उन्होंने इस व्यवहार दिखाता है कि कैसे Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS प्रदर्शन देता है इसे बाहर की जाँच करें।।)

अद्यतन: एसक्यूएल सर्वर 2012 से, वहाँ अंत में code pages for UTF-16, उदाहरण के Latin1_General_100_CI_AS_SC लिए कर रहे हैं, जो सही मायने में कवर कर सकते हैं पूरी यूनिकोड रेंज।

0

Differences between CHAR, NCHAR, VARCHAR and NVARCHAR?

CHAR:

चार [(एन)]

  • भंडारण आकार n बाइट है।
  • char के लिए आईएसओ समानार्थी वर्ण है।

उदाहरण:

-- Declare a temporary variable. 
Declare @text char 

-- Assign value to temporary variable. 
Set @text = 'hello' 

-- Get temporary variable data. 
Select @text as [Output] 

आउटपुट:

हम आउटपुट के रूप में मिला है। क्योंकि हमने चार के लिए कोई लंबाई निर्दिष्ट नहीं की है। यह के रूप में डिफ़ॉल्ट लंबाई लेगा।

VARCHAR:

varchar [(एन | अधिकतम)]

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

NCHAR:

nchar [(एन)]

  • निश्चित-लंबाई यूनिकोड स्ट्रिंग डेटा।
  • एन स्ट्रिंग लंबाई को परिभाषित करता है और 1 से 4,000 से एक मान होना चाहिए।
  • एनचर के लिए आईएसओ समानार्थी राष्ट्रीय चार और राष्ट्रीय चरित्र हैं।

NVARCHAR:

nvarchar [(एन | अधिकतम)]

  • चर लंबाई यूनिकोड स्ट्रिंग डेटा।
  • एन स्ट्रिंग लंबाई को परिभाषित करता है और 1 से 4,000 का मान हो सकता है।
  • अधिकतम इंगित करता है कि अधिकतम संग्रहण आकार 2^31-1 बाइट्स (2 जीबी) है।
  • nvarchar के लिए आईएसओ समानार्थी राष्ट्रीय चार भिन्न और राष्ट्रीय चरित्र भिन्न हैं।

Read more on "Differences between CHAR, NCHAR, VARCHAR and NVARCHAR?" with examples here.

9

nchar[(n)] (राष्ट्रीय चरित्र)

  • निश्चित-लंबाई यूनिकोड स्ट्रिंग डेटा।
  • n स्ट्रिंग लंबाई को परिभाषित करता है और 1 से 4,000 का मान होना चाहिए।
  • भंडारण का आकार दो बार n बाइट्स है।

nvarchar [(n | max)] (राष्ट्रीय चरित्र बदलती।)

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

char [(n)] (चरित्र)

  • फिक्स्ड लंबाई, non-Unicode स्ट्रिंग डेटा है ।
  • n स्ट्रिंग लंबाई को परिभाषित करता है और 1 से 8,000 का मान होना चाहिए।
  • भंडारण का आकार n बाइट्स है।

varchar [(n | max)] (चरित्र अलग)

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