प्रकार के SQL सर्वर कॉलम के लिए

VARCHAR(100)

कॉलम में डालने से पहले, मैं यह सुनिश्चित करना चाहता हूं कि डाला जा रहा मूल्य 100 से अधिक नहीं है। क्या वह संख्या अधिकतम वर्णों को निर्दिष्ट कर सकती है, या यह बाइट्स की संख्या है चरित्र डेटा जो इसे स्टोर कर सकता है?

मैं जो कारण पूछ रहा हूं वह यह है कि कुछ यूनिकोड विशेष वर्ण एक से अधिक बाइट का उपयोग करते हैं। इसलिए, यूनिकोड में एन्कोडेड 100 वर्ण स्ट्रिंग में 100 से अधिक बाइट्स लग सकते हैं।

चूंकि varchar ASCII एन्कोडिंग के लिए है, क्या किसी ASCII वर्ण के लिए एक से अधिक बाइट लेना संभव है (जिसके लिए बाइट लंबाई की जांच की आवश्यकता हो सकती है)?

(संपादित करें: प्रश्न पर मुझे मिली प्रतिक्रिया के आधार पर, मैं देखता हूं कि varchar ASCII के लिए और nvarchar यूनिकोड के लिए उपयोग किया जाना चाहिए।)

2
Josh Withee 14 पद 2017, 06:28

4 जवाब

सबसे बढ़िया उत्तर

उपयुक्त एन्कोडर के लिए GetByteCount का उपयोग करें- - इस मामले में, VarChar के लिए ASCII और NVarChar के लिए यूनिकोड)।

    var s = "This is a string";
    var len1 = s.Length;
    var len2 = System.Text.Encoding.Unicode.GetByteCount(s);
    var len3 = System.Text.Encoding.ASCII.GetByteCount(s);
    Console.WriteLine("'{0}' has {1} characters and is {2} bytes with Unicode encoding and {3} bytes with ASCII encoding.", s, len1, len2, len3);

आउटपुट:

'This is a string' has 16 characters and is 32 bytes with Unicode encoding and 16 bytes with ASCII encoding.
6
John Wu 14 पद 2017, 07:08

लंबाई की जांच करने का सही तरीका है

if (myString.Length > 100)
{
    MessageBox.Show("String too long");
    return; 
}

.NET string पहले से ही यूनिकोड है और आपके पास जो भी वर्ण हैं उन्हें धारण कर सकता है। इसके विपरीत, varchar डेटाटाइप न्यायसंगत और ASCII- प्रकार है और यह यूनिकोड का समर्थन नहीं करेगा। आपको डीबी कॉलम को nvarchar के रूप में घोषित करना है, और सब कुछ सुचारू रूप से काम करेगा। पागल कुछ मत करो।

0
T.S. 14 पद 2017, 07:17

यदि यह पहले से ही एक स्ट्रिंग है, तो आपको केवल यह सुनिश्चित करने की आवश्यकता है कि स्ट्रिंग लंबाई में 100 वर्णों से अधिक नहीं है

-1
Kevin 14 पद 2017, 06:37

मैंने इस प्रश्न पर शोध करने से कुछ सीखा!

एसक्यूएल सर्वर में

  1. nvarchar डबल स्टोरेज लेता है क्योंकि यह दो बाइट कैरेक्टर सेट UNICODE UCS-2 का उपयोग करता है।

n स्ट्रिंग की लंबाई को परिभाषित करता है ... भंडारण का आकार, बाइट्स में, दर्ज किए गए डेटा की वास्तविक लंबाई + 2 बाइट्स का दोगुना है।

यह मुझे बताता है कि nvarchar के लिए निर्दिष्ट लंबाई निश्चित रूप से वर्णों की संख्या है, बाइट्स नहीं।

  1. varchar एक वर्ण भंडारण के लिए एक बाइट है, और एकल बाइट गैर-यूनिकोड वर्ण डेटा संग्रहीत करता है।

n स्ट्रिंग की लंबाई को परिभाषित करता है ... भंडारण का आकार दर्ज किए गए डेटा की वास्तविक लंबाई + 2 बाइट्स है।

मैं उन दो कथनों से अनुमान लगाऊंगा कि varchar या nvarchar कॉलम की लंबाई के लिए इंगित संख्या वास्तव में वर्णों की संख्या है।

वाक्यांश length of the data entered कुछ अस्पष्ट है, लेकिन दो विवरणों से मुझे लगता है कि यह निष्कर्ष निकालना उचित है कि उनका मतलब दर्ज किए गए वर्णों की संख्या है।

यदि आपके पास दो बाइट वर्ण डेटा प्राप्त करने और संग्रहीत करने की क्षमता है, तो हमेशा nvarchar over varchar भले ही प्रदर्शन हिट हो सकता है। जुड़े हुए प्रश्न और उत्तर यह देखने में सहायक होते हैं कि क्यों।

लब्बोलुआब यह है कि SQL सर्वर varchar और nvarchar कॉलम की लंबाई को दर्ज किए गए वर्णों की संख्या के रूप में व्यक्त कर रहा है। यह आपके लिए स्टोरेज का ख्याल रखेगा। बाइट्स के बारे में चिंता मत करो!

नोट: भ्रम में जोड़ना यह है कि Oracle आपको बाइट लंबाई या वर्ण लंबाई निर्दिष्ट करने की अनुमति देता है मूल प्रकार में VARCHAR2:

Oracle VARCHAR2

वैश्वीकृत डेटाबेस का समर्थन करने के लिए मल्टी-बाइट कैरेक्टर सेट के बढ़ते उपयोग के साथ बाइट्स की समस्या अब वर्णों के बराबर नहीं है।

VARCHAR2 और CHAR प्रकार लंबाई निर्दिष्ट करने के दो तरीकों का समर्थन करते हैं:

बाइट्स में: VARCHAR2 (10 बाइट)। यह डेटा के 10 बाइट तक का समर्थन करेगा, जो कि एक बहु-बाइट वर्ण सेट में कम से कम दो वर्ण हो सकते हैं। वर्णों में: VARCHAR2(10 वर्ण)। यह डेटा के 10 वर्णों तक का समर्थन करेगा, जो कि 40 बाइट्स की जानकारी तक हो सकता है।

और ऐसा प्रतीत होता है कि डिफ़ॉल्ट बाइट्स है!

ऐसा लगता है कि यह सिर्फ हम से अधिक के लिए भ्रमित कर रहा है:

Oracle varchar2 - बाइट्स या वर्ण

इसलिए यदि आप Oracle की दुनिया से आ रहे हैं, तो आप मान सकते हैं कि यह हर जगह सच है। और यदि आप SQL सर्वर की दुनिया से आ रहे हैं, तो आपको शायद यह एहसास न हो कि यह मामला है!

एसक्यूएल सर्वर में

जो चीज मुझे भ्रमित करती है वह यह है कि UTF-8 यूनिकोड वर्ण 6 बाइट तक ले सकते हैं, और कई 1 बाइट तक ले सकते हैं! और फिर भी, डॉक्स कहते हैं कि प्रत्येक वर्ण ठीक दो बाइट लेता है।

तो वास्तव में... एक यूनिकोड वर्ण कितने बाइट लेता है?

उत्तर: SQL सर्वर UNICODE UCS-2 का उपयोग कर रहा है, जो

प्रत्येक वर्ण के लिए 0 और 65,535 के बीच एक एकल कोड मान (कोड बिंदु का प्रतिनिधित्व करने वाली एक या अधिक संख्याओं के रूप में परिभाषित) का उपयोग करता है, और उस मान का प्रतिनिधित्व करने के लिए ठीक दो बाइट्स (एक 16-बिट शब्द) की अनुमति देता है।

जो बताता है कि क्यों SQL सर्वर में लंबाई के आधार पर वर्ण स्ट्रिंग की एक विशिष्ट मात्रा में स्थान हो सकता है। सभी वर्ण एक nvarchar कॉलम में दो बाइट लेते हैं!

1
Josh Hull 27 पद 2017, 17:15