SQL सर्वर में char, nchar, varchar और nvarchar में क्या अंतर है?


622

क्या मतलब है nvarchar?

बीच क्या अंतर है char, nchar, varchar, और nvarcharSQL सर्वर में?

जवाबों:


856

बस साफ़ करने के लिए ... या योग ...

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

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


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

10
यह इस बात पर निर्भर है कि n...संस्करण मेरे
मार्टिन स्मिथ

7
भंडारण को बढ़ाने से क्या फायदा है?
mlissner

4
अंतिम बिंदु पर: यूनिकोड एनकर और नावरचर का उपयोग करना अभी भी ज्यादातर मामलों में बेहतर है, बेहतर कोलाजेशन, उपयोगकर्ताओं के लिए लचीलापन, भविष्य की संगतता के मुद्दों को दूर करता है। और वैसे भी इस स्थान के लिए भंडारण स्थान कोई समस्या नहीं है, क्योंकि यूनिकोड के बिना टकराव का उपयोग करने से बहुत परेशानी होती है, और भविष्य में मेमोरी दरें घटती रहेंगी
Jaison Varghese

6
@ बेनकेन चार (20) 20 बाइट्स (8-बिट कॉलेशन मानकर) का उपयोग करेगा; varchar (20) डेटा के 20 बाइट्स के लिए लेन (डेटा) +2 बाइट्स यानी 22 का उपयोग करेगा, लेकिन डेटा के 10 बाइट्स के लिए केवल 12। अतिरिक्त दो बाइट्स लंबाई रिकॉर्ड हैं। यदि आपका डेटा हमेशा पूरी लंबाई का होगा, तो एक चार का उपयोग करें, क्योंकि यह अंतरिक्ष बचाता है और तेज हो सकता है। कृपया कभी भी एक varchar (1) का उपयोग न करें, या वास्तव में कुछ varchar (4) से छोटा नहीं है। Varchar प्रारूप में एक एकल वर्ण तीन बाइट्स का उपयोग करता है, इसलिए एक char (3) कभी भी varchar (3) की तुलना में अधिक स्थान का उपयोग नहीं करेगा।
रिचर्ड गैडसन

95

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

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  

रिटर्न

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

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

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

इसकी वजह से एक nvarchar(X)कॉलम से varchar(X)कॉलम के लिए ट्रंकेशन एरर (जहां एक्स एक संख्या को दर्शाता है, जो दोनों उदाहरणों में समान है) को विफल करने के लिए संभव है ।

SQL Server 2012 SC (सप्लीमेंट्री कैरेक्टर) कोलिशन को सपोर्ट करता है UTF-16। इन टकरावों में एक एकल nvarcharवर्ण 2 या 4 बाइट्स ले सकता है।


4
जिस तरह के जवाब की मुझे तलाश थी। मुझे पसंद करने के लिए समय बचाने के लिए - गैर-अंग्रेज़ी पाठ "पीपुल्स रिपब्लिक ऑफ़ चाइना" में अनुवाद करता है।
अनुवाद- Iiiauto

34

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

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

इस सवाल का डुप्लिकेट है इस एक


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

33

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

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

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


24

मौजूदा उत्तरों को संक्षेप और सही करने का मेरा प्रयास:

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

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

अब कुछ बारीक बिंदुओं के लिए।

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

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

अद्यतन: SQL Server 2012 के रूप में, अंत में UTF-16 के लिए कोड पृष्ठ हैं , उदाहरण के लिए Latin1_General_100_CI_AS_SC, जो वास्तव में संपूर्ण यूनिकोड श्रेणी को कवर कर सकता है।


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

char8-बिट लंबाई नहीं हो सकती है। इसमें लंबाई स्टोर करने की आवश्यकता नहीं है, और निश्चित लंबाई 8000 वर्णों तक हो सकती है।
जॉन बी। लाम्बे

12

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

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

nvarchar [(n | max)] (राष्ट्रीय चरित्र अलग-अलग)

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

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

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

varchar [(n | max)] (चरित्र भिन्न)

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

7

अंतर हैं:

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

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


7

nchar को nvarchar से अधिक जगह की आवश्यकता होती है ।

जैसे,

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


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

5

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


गलत तुलना - प्रश्न नच और वरचर से संबंधित है, न कि नख और नवरच से।
ल्यूक बेनेट

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

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


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

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

4
@Workshop एलेक्स: गलत। यूनिकोड के रूप में एन्कोड UCS-2(जो SQL सर्वर द्वारा प्रयुक्त एन्कोडिंग होता है) के प्रत्येक वर्ण को संग्रहीत करता है वास्तव में दो बाइट्स, देख msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx : SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)। SQL सर्वर 2008 SCSU संपीड़न का उपयोग कर सकता है, लेकिन अभी भी UCS-2 एन्कोडेड यूनिकोड स्ट्रिंग्स का संपीड़न है: msdn.microsoft.com/en-us/library/ee240835.aspx
Remus Rusanu

2

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


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

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

@ आप सही हैं, यूनिकोड के लिए कई एनकोडिंग हैं जो एक अलग संख्या में बाइट्स का उत्पादन कर सकते हैं। लेकिन SQL सर्वर आपको यूनिकोड एन्कोडिंग के बारे में कोई विकल्प नहीं देता है। 2012 से पहले एसक्यूएल सर्वर ने केवल यूसीएस -2 का उपयोग किया, दो बाइट्स चौड़े थे, इसलिए मार्टिन ने उस समय उत्तर सही था जब उन्होंने उत्तर लिखा था। जैसा कि ऊपर दिए गए अन्य उत्तरों में कहा गया है, SQL Server 2012 अब UTF-16 प्रदान करता है, इसलिए कई पात्रों के लिए दो बाइट (यूनिकोड बेसिक मल्टीलिंगुअल प्लेन में), अन्य के लिए चार बाइट्स।
कंक्रीट गनेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.