क्या मतलब है nvarchar
?
बीच क्या अंतर है char
, nchar
, varchar
, और nvarchar
SQL सर्वर में?
क्या मतलब है nvarchar
?
बीच क्या अंतर है char
, nchar
, varchar
, और nvarchar
SQL सर्वर में?
जवाबों:
बस साफ़ करने के लिए ... या योग ...
nchar
और यूनिकोड वर्णों nvarchar
को संग्रहीत कर सकता है ।char
और यूनिकोड वर्णों को संग्रहीत नहीं कर सकता ।varchar
char
और nchar
कर रहे हैं निश्चित लंबाई जो होगा भंडारण स्थान आरक्षित वर्णों की संख्या के लिए भले ही आप सब है कि अंतरिक्ष का उपयोग नहीं करते हो जाए।varchar
और nvarchar
कर रहे हैं चर लंबाई जो केवल वे वर्ण जो आप की दुकान के लिए रिक्त स्थान का उपयोग करेगा। यह या की तरह भंडारण आरक्षित नहीं करेगाchar
nchar
।nchar
और nvarchar
स्टोरेज स्पेस से दुगना समय लगेगा, इसलिए यूनिकोड समर्थन की आवश्यकता होने पर ही उनका उपयोग करना बुद्धिमानी हो सकती है ।
n...
संस्करण मेरे
अब तक के सभी उत्तरों से संकेत मिलता है कि 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 बाइट्स ले सकता है।
nchar और char बहुत ज्यादा एक दूसरे की तरह ही काम करते हैं, जैसे nvarchar और varchar करते हैं। उनके बीच एकमात्र अंतर यह है कि nchar / nvarchar store यूनिकोड वर्ण (आवश्यक यदि आपको विस्तारित वर्ण सेट के उपयोग की आवश्यकता है), जबकि varchar नहीं करता है।
क्योंकि यूनिकोड वर्णों को अधिक संग्रहण की आवश्यकता होती है, nchar / nvarchar फ़ील्ड्स दो बार अधिक स्थान लेती हैं (इसलिए SQL सर्वर के पुराने संस्करणों में उदाहरण के लिए एक nvarchar फ़ील्ड का अधिकतम आकार 4000 है)।
इस सवाल का डुप्लिकेट है इस एक ।
बस कुछ और जोड़ने के लिए: nchar - डेटा में अनुगामी रिक्त स्थान जोड़ता है। nvarchar - डेटा में अनुगामी रिक्त स्थान नहीं जोड़ता है।
इसलिए, यदि आप 'nchar' क्षेत्र द्वारा अपने डेटासेट को फ़िल्टर करने जा रहे हैं, तो आप रिक्त स्थान को निकालने के लिए RTRIM का उपयोग कर सकते हैं। ईजी नर्चर (10) क्षेत्र जिसे ब्रैंड कहा जाता है, नाइक शब्द को संग्रहीत करता है। यह शब्द के दाईं ओर 6 रिक्त स्थान जोड़ता है। इसलिए, फ़िल्टर करते समय, अभिव्यक्ति को पढ़ना चाहिए: RTRIM (फ़ील्ड! BRAND.Value) = "NIKE"
आशा है कि यह किसी को वहाँ से बाहर निकलने में मदद करता है क्योंकि मैं अभी इसके लिए थोड़ा संघर्ष कर रहा था!
मौजूदा उत्तरों को संक्षेप और सही करने का मेरा प्रयास:
सबसे पहले, 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, जो वास्तव में संपूर्ण यूनिकोड श्रेणी को कवर कर सकता है।
char
: 8000 वर्णों की अधिकतम लंबाई के साथ निश्चित-लंबाई वर्ण डेटा।nchar
: 4000 वर्णों की अधिकतम लंबाई के साथ निश्चित-लंबाई वाला यूनिकोड डेटा।Char
= 8 बिट लंबाईNChar
= 16 बिट लंबाईchar
8-बिट लंबाई नहीं हो सकती है। इसमें लंबाई स्टोर करने की आवश्यकता नहीं है, और निश्चित लंबाई 8000 वर्णों तक हो सकती है।
nchar[(n)]
(राष्ट्रीय चरित्र)
n
स्ट्रिंग की लंबाई को परिभाषित करता है और 4,000 के माध्यम से 1 से एक मान होना चाहिए।n
बाइट्स है।nvarchar [(n | max)]
(राष्ट्रीय चरित्र अलग-अलग)
n
स्ट्रिंग की लंबाई को परिभाषित करता है और 4,000 के माध्यम से 1 से मान हो सकता है।max
इंगित करता है कि अधिकतम भंडारण आकार 2 ^ 31-1 बाइट्स (2 जीबी) है।char [(n)]
(चरित्र)
non-Unicode
स्ट्रिंग डेटा।n
स्ट्रिंग की लंबाई को परिभाषित करता है और 8,000 के माध्यम से 1 से एक मान होना चाहिए।n
बाइट्स है।varchar [(n | max)]
(चरित्र भिन्न)
n
स्ट्रिंग की लंबाई को परिभाषित करता है और 1 से 8,000 तक का मान हो सकता है।max
इंगित करता है कि अधिकतम भंडारण आकार 2 ^ 31-1 बाइट्स (2 जीबी) है।अंतर हैं:
एक और अंतर लंबाई का है। नट और नवरचचर दोनों ही 4,000 वर्णों तक लंबे हो सकते हैं। और char और varchar 8000 वर्णों तक लंबे हो सकते हैं। लेकिन SQL सर्वर के लिए आप एक [n] varchar (अधिकतम) का भी उपयोग कर सकते हैं जो 2,147,483,648 वर्णों को संभाल सकता है। (दो गीगाबाइट, एक हस्ताक्षरित 4-बाइट पूर्णांक।)
nchar को nvarchar से अधिक जगह की आवश्यकता होती है ।
जैसे,
एक nchar (100) हमेशा 100 वर्णों को संग्रहीत करेगा भले ही आप केवल 5 दर्ज करें, शेष 95 वर्ण रिक्त स्थान के साथ गद्देदार होंगे। एक nvarchar (100) में 5 वर्णों को संग्रहीत करने से 5 वर्ण बचेंगे।
nchar (10) एक निश्चित लंबाई वाला यूनिकोड स्ट्रिंग है। 10. nvarchar (10) 10. की अधिकतम लंबाई के साथ एक वैरिएबल-लंबाई वाला यूनिकोड स्ट्रिंग है। आमतौर पर, आप पूर्व का उपयोग करेंगे यदि सभी डेटा मान 10 वर्ण और बाद वाले हों। अगर लंबाई बदलती हैं।
नचर निश्चित-लंबाई है और यूनिकोड वर्णों को पकड़ सकता है। यह प्रति वर्ण दो बाइट्स संग्रहण का उपयोग करता है।
varchar वैरिएबल लंबाई का होता है और यूनिकोड वर्णों को धारण नहीं कर सकता है। यह प्रति चरित्र एक बाइट संग्रहण का उपयोग करता है।
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
NVARCHAR यूनिकोड वर्णों को संग्रहीत कर सकता है और प्रति वर्ण 2 बाइट लेता है।
nvarchar
हमेशा प्रति वर्ण 2 बाइट लेता है।