पात्रों को संग्रहित करना और उनका प्रतिनिधित्व करना एक बात है, और यह जानना कि उन्हें कैसे छाँटना और उनकी तुलना करना है, दूसरी बात है।
यूनिकोड डेटा, XML
. में संग्रहीत और N
SQL सर्वर में -prefixed प्रकार, एकल वर्ण सेट के साथ सभी भाषाओं में सभी वर्णों का प्रतिनिधित्व कर सकते हैं (अधिकांश भाग के लिए, और यही इसका लक्ष्य है)। तो NCHAR
. के लिए / NVARCHAR
डेटा (मैं NTEXT
छोड़ रहा हूं) क्योंकि अब इसका उपयोग नहीं किया जाना चाहिए, और XML
क्योंकि यह Collations से प्रभावित नहीं होता है), Collations यह नहीं बदलता है कि कौन से वर्ण संग्रहीत किए जा सकते हैं। CHAR
के लिए और VARCHAR
डेटा, Collations करते हैं जो संग्रहीत किया जा सकता है उसे प्रभावित करें क्योंकि प्रत्येक Collation एक विशेष कोड पृष्ठ की ओर इशारा करता है, जो निर्धारित करता है कि 128 - 255 के मानों में क्या संग्रहीत किया जा सकता है।
अब, जबकि सभी वर्णों के लिए एक डिफ़ॉल्ट सॉर्ट क्रम है, जो संभवतः सभी भाषाओं और संस्कृतियों में काम नहीं कर सकता है। ऐसी कई भाषाएं हैं जो कुछ/कई/सभी वर्णों को साझा करती हैं, लेकिन उन्हें क्रमबद्ध करने के लिए अलग-अलग नियम हैं। उदाहरण के लिए, "सी" अक्षर उन अक्षरों का उपयोग करने वाले अधिकांश अक्षरों में "डी" अक्षर से पहले आता है। यूएस अंग्रेजी में, "सी" और "एच" (यानी "सीएच" दो अलग-अलग अक्षरों के रूप में) का संयोजन स्वाभाविक रूप से "डी" से शुरू होने वाली किसी भी स्ट्रिंग से पहले आएगा। लेकिन, कुछ भाषाओं में, "CH" का दो-अक्षर वाला संयोजन विशेष होता है और बाद को क्रमबद्ध करता है "डी":
IF ( N'CH' COLLATE Czech_CI_AI > N'D' COLLATE Czech_CI_AI
AND N'C' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
AND N'CI' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
) PRINT 'Czech_CI_AI';
IF ( N'CH' COLLATE Czech_100_CI_AI > N'D' COLLATE Czech_100_CI_AI
AND N'C' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
AND N'CI' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
) PRINT 'Czech_100_CI_AI';
IF ( N'CH' COLLATE Slovak_CI_AI > N'D' COLLATE Slovak_CI_AI
AND N'C' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
AND N'CI' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
) PRINT 'Slovak_CI_AI';
IF ( N'CH' COLLATE Slovak_CS_AS > N'D' COLLATE Slovak_CS_AS
AND N'C' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
AND N'CI' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
) PRINT 'Slovak_CS_AS';
IF ( N'CH' COLLATE Latin1_General_100_CI_AS > N'D' COLLATE Latin1_General_100_CI_AS
AND N'C' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
AND N'CI' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
) PRINT 'Latin1_General_100_CI_AS'
ELSE PRINT 'Nope!';
रिटर्न:
Czech_CI_AI
Czech_100_CI_AI
Slovak_CI_AI
Slovak_CS_AS
Nope!
विभिन्न संस्कृतियों में नियमों को छांटने के उदाहरण देखने के लिए, कृपया देखें:संयोजन चार्ट ।
साथ ही, कुछ भाषाओं में कुछ अक्षर या अक्षरों के संयोजन अन्य अक्षरों के समान होते हैं, जो कि अधिकांश अन्य भाषाओं में नहीं होते हैं। उदाहरण के लिए, केवल डेनिश में "å" "आ" के बराबर होता है। लेकिन, "å" केवल एक "a" के बराबर नहीं है:
IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI = N'å' COLLATE Danish_Greenlandic_100_CI_AI
AND N'a' COLLATE Danish_Greenlandic_100_CI_AI <> N'å' COLLATE Danish_Greenlandic_100_CI_AI
) PRINT 'Danish_Greenlandic_100_CI_AI';
IF ( N'aa' COLLATE Danish_Norwegian_CI_AI = N'å' COLLATE Danish_Norwegian_CI_AI
AND N'a' COLLATE Danish_Norwegian_CI_AI <> N'å' COLLATE Danish_Norwegian_CI_AI
) PRINT 'Danish_Norwegian_CI_AI';
IF ( N'aa' COLLATE Latin1_General_100_CI_AI = N'å' COLLATE Latin1_General_100_CI_AI
AND N'a' COLLATE Latin1_General_100_CI_AI <> N'å' COLLATE Latin1_General_100_CI_AI
) PRINT 'Latin1_General_100_CI_AI'
ELSE PRINT 'Nope!';
रिटर्न:
Danish_Greenlandic_100_CI_AI
Danish_Norwegian_CI_AI
Nope!
यह सब बहुत जटिल है, और मैंने दाएँ-से-बाएँ भाषाओं (हिब्रू और अरबी), चीनी, जापानी, वर्णों के संयोजन, आदि के लिए हैंडलिंग का भी उल्लेख नहीं किया है।
यदि आप नियमों में कुछ गहरी अंतर्दृष्टि चाहते हैं, तो यूनिकोड कोलेशन एल्गोरिथम (UCA) . ऊपर दिए गए उदाहरण उस दस्तावेज़ में दिए गए उदाहरणों पर आधारित हैं, हालांकि मुझे विश्वास नहीं है कि यूसीए के सभी नियम लागू किए गए हैं, खासकर जब से विंडोज कोलाज (संयोजन नहीं) SQL_
से शुरू हो रहा है ) यूनिकोड 5.0 या 6.0 पर आधारित हैं, जो इस बात पर निर्भर करता है कि आप किस ओएस का उपयोग कर रहे हैं और .NET फ्रेमवर्क का संस्करण जो स्थापित है (देखें SortVersion
विवरण के लिए)।
तो यही है कि Collations क्या करते हैं। यदि आप उपलब्ध सभी कोलेशन देखना चाहते हैं, तो बस निम्नलिखित को चलाएँ:
SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];