Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में संयोजन

परिचय

आपने SQL सर्वर में "Collation" शब्द पहले ही सुना होगा। Collation एक कॉन्फ़िगरेशन है जो यह निर्धारित करता है कि वर्ण डेटा सॉर्टिंग कैसे की जाती है। यह एक महत्वपूर्ण सेटिंग है जिसका इस बात पर बहुत प्रभाव पड़ता है कि SQL सर्वर डेटाबेस इंजन कैरेक्टर डेटा से निपटने में कैसे व्यवहार करता है। इस लेख में, हम सामान्य रूप से कोलाजंस पर चर्चा करना चाहते हैं और कोलाजंस से निपटने के कुछ उदाहरण दिखाना चाहते हैं।

मैं संयोजन कहां ढूंढूं?

आप सर्वर, डेटाबेस और कॉलम स्तर पर SQL संयोजन पा सकते हैं। जानने के लिए एक और महत्वपूर्ण बात यह है कि सर्वर, डेटाबेस और कॉलम स्तर पर कॉलेशन सेटिंग समान नहीं होनी चाहिए। साथ ही, आप विशिष्ट कॉलेशन का उपयोग करने के लिए अपने प्रश्नों को अपडेट कर सकते हैं। यह इस समय है कि आप अपने परिवेश में सही कोलेशन को कॉन्फ़िगर करने के महत्व को महसूस करेंगे क्योंकि यदि कोलेशन संगत नहीं है तो अनपेक्षित मुद्दों की एक उच्च संभावना है।

विभिन्न प्रकार के संयोजन क्या उपलब्ध हैं?

आप सिस्टम फ़ंक्शन sys.fn_helpcollations()

को क्वेरी करके उपलब्ध कॉलेशन की पूरी सूची प्राप्त कर सकते हैं
select * from sys.fn_helpcollations()
से * चुनें

यह निम्न आउटपुट लौटाएगा।

यदि आप भाषा के आधार पर विशिष्ट संयोजनों की तलाश कर रहे हैं, तो आप नाम को आगे फ़िल्टर कर सकते हैं। उदाहरण के लिए, यदि आप माओरी भाषा समर्थित संयोजन की तलाश कर रहे हैं, तो आप निम्न क्वेरी का उपयोग कर सकते हैं।

select * from sys.fn_helpcollations()
    where name like '%Maori%'

यह निम्न आउटपुट लौटाएगा।

इस तरह आप अपनी पसंद के मिलान के लिए समर्थित कोलाज की जांच कर सकते हैं। केवल fn_helpcollations() सिस्टम फ़ंक्शन को क्वेरी करने पर, कुल 5508 पंक्तियाँ लौटा दी गईं, जिसका अर्थ है कि कई समर्थित कॉलेशन हैं। ध्यान दें, कि इसमें दुनिया भर की अधिकांश भाषाएं शामिल हैं।

संलयन नाम में आपको कौन से विभिन्न विकल्प दिखाई देते हैं?

उदाहरण के लिए, इस संयोजन में:Maori_100_CS_AI_KS_WS_SC_UTF8, आप संयोजन नाम में विभिन्न विकल्प देख सकते हैं।

सीएस – केस-संवेदी
AI – उच्चारण-असंवेदनशील
KS – काना टाइप-सेंसिटिव
WS – चौड़ाई के प्रति संवेदनशील
SC – पूरक पात्र
UTF8 - एन्कोडिंग मानक
चयनित कोलेशन विकल्प के प्रकार के आधार पर, SQL सर्वर डेटाबेस इंजन सॉर्टिंग और सर्च ऑपरेशन के लिए कैरेक्टर डेटा से निपटने में अलग तरह से प्रदर्शन करेगा। उदाहरण के लिए, यदि आप SQL संयोजन में केस-संवेदी विकल्प का उपयोग करते हैं, तो डेटाबेस इंजन "एडम" या "एडम" की तलाश में क्वेरी ऑपरेशन के लिए अलग तरह से व्यवहार करेगा। मान लें कि आपके पास "नमूना" नामक एक तालिका है और उपयोगकर्ता "एडम" के साथ पहला नाम कॉलम है। यदि प्रथम नाम "एडम" के साथ कोई पंक्ति नहीं है, तो नीचे दी गई क्वेरी कोई परिणाम नहीं देगी। यह संयोजन में "सीएस-केस संवेदनशील" विकल्प के कारण है।

select * from sample
    where firstname like '%Adam%'

इस सरल उदाहरण से, आप सही SQL संयोजन विकल्प चुनने के महत्व को समझ सकते हैं। सबसे पहले मिलान का चयन करने से पहले सुनिश्चित करें कि आप आवेदन आवश्यकताओं को समझते हैं।

SQL सर्वर इंस्टेंस पर संयोजन ढूँढना

आप SQL सर्वर प्रबंधन स्टूडियो (SSMS) में SQL इंस्टेंस पर राइट-क्लिक करके, फिर "गुण" विकल्प पर क्लिक करके और "सामान्य" टैब की जाँच करके सर्वर कोलाज प्राप्त कर सकते हैं। यह संयोजन डिफ़ॉल्ट रूप से SQL सर्वर की स्थापना पर चुना जाता है।

वैकल्पिक रूप से, आप कोलेशन वैल्यू को खोजने के लिए सर्वरप्रॉपर्टी विकल्प का उपयोग कर सकते हैं।

select SERVERPROPERTY('collation'),

SQL डेटाबेस का मिलान ढूँढना

SSMS में, SQL डेटाबेस पर राइट-क्लिक करें और "Properties" पर जाएँ। जैसा कि नीचे दिखाया गया है, आप "सामान्य" टैब में मिलान विवरण देख सकते हैं।

वैकल्पिक रूप से, आप डेटाबेस कोलेशन का विवरण प्राप्त करने के लिए डेटाबेसप्रॉपर्टीएक्स फ़ंक्शन का उपयोग कर सकते हैं।

select DATABASEPROPERTYEX('Your DB Name','collation')

तालिका में किसी स्तंभ का मिलान ढूँढना

एसएसएमएस में, टेबल पर जाएं, फिर कॉलम पर जाएं और अंत में "गुण" देखने के लिए अलग-अलग कॉलम पर राइट-क्लिक करें। यदि कॉलम एक वर्ण डेटा प्रकार का है, तो आप संयोजन का विवरण देखेंगे।

हालाँकि, उसी समय, यदि आप एक गैर-वर्ण डेटा प्रकार के लिए मान की जाँच करते हैं, तो संयोजन मान शून्य होगा। नीचे एक कॉलम का स्क्रीनशॉट है जिसमें इंट डेटा टाइप है।

वैकल्पिक रूप से, आप कॉलम के लिए मिलान मान देखने के लिए नीचे एक नमूना क्वेरी का उपयोग कर सकते हैं।

select sc.name, sc.collation_name from sys.columns sc
inner join sys.tables t on sc.object_id=t.object_id
where t.name='t1' – enter your table name

नीचे क्वेरी के लिए आउटपुट है।

SQL क्वेरी में अलग-अलग कॉलेशन आज़माना

इस खंड में, हम देखेंगे कि प्रश्नों में अलग-अलग कॉलेशन का उपयोग करने पर सॉर्ट ऑर्डर कैसे प्रभावित होता है। नीचे दिखाए गए अनुसार 2 कॉलम के साथ एक नमूना तालिका बनाई गई है।

fname कॉलम में उस डेटाबेस का डिफ़ॉल्ट संयोजन होता है जिससे वह संबंधित होता है। इस मामले में, संयोजन SQL_Latin1_General_CP1_CI_AS है।
तालिका में कुछ रिकॉर्ड सम्मिलित करने के लिए, नीचे एक क्वेरी का उपयोग करें। मापदंडों के लिए अपने स्वयं के मान निर्दिष्ट करें।

insert into emp
  values (1,'mohammed')
  insert into emp 
  values (2,'moinudheen')
  insert into emp
  values (3,'Mohammed')
  insert into emp
  values (4,'Moinudheen')
  insert into emp
  values (5,'MOHAMMED')
  insert into emp
  values (6,'MOINUDHEEN')

अब, emp तालिका को क्वेरी करें और इसे अलग-अलग कॉलेशन का उपयोग करके fname कॉलम द्वारा सॉर्ट करें। हम छँटाई के लिए कॉलम के डिफ़ॉल्ट संयोजन का उपयोग करेंगे और साथ ही एक अन्य केस संवेदनशील संयोजन - SQL_Latin1_General_CP1_CS_AS।

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS 
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – this is default

इन प्रश्नों के लिए आउटपुट नीचे दिया गया है। उपयोग किए गए संयोजन में अंतर पर ध्यान दें। हम केस असंवेदनशील के बजाय केस सेंसिटिव का उपयोग कर रहे हैं।

अंतर जानने के लिए आप इन दोनों प्रश्नों के लिए क्वेरी प्लान भी देख सकते हैं। पहली क्वेरी योजना पर जहां हम कॉलम में एक से भिन्न कॉलेशन का उपयोग करते हैं, आप अतिरिक्त "कंप्यूट स्केलर" ऑपरेटर को देख सकते हैं।

जब आप "कंप्यूट स्केलर" ऑपरेटर पर माउस घुमाते हैं, तो आपको नीचे दिखाए गए अतिरिक्त विवरण दिखाई देंगे। यह उस अंतर्निहित रूपांतरण के कारण है जो हो रहा है क्योंकि हम कॉलम में उपयोग किए गए डिफ़ॉल्ट से एक अलग संयोजन का उपयोग कर रहे हैं।

इस छोटे से उदाहरण के साथ, जब आप क्वेरी में स्पष्ट रूप से कॉलेशन का उपयोग करते हैं, तो आप क्वेरी प्रदर्शन पर किस प्रकार का प्रभाव देख सकते हैं। हमारे डेमो डेटाबेस में, हमने एक साधारण तालिका का उपयोग किया है, लेकिन एक वास्तविक समय परिदृश्य की कल्पना करें जहां क्वेरी प्रदर्शन में छोटे बदलाव अप्रत्याशित परिणाम दे सकते हैं।

जांच करना कि क्या इंस्टेंस स्तर पर संयोजन को बदलना संभव है

इस खंड में, हम विभिन्न परिदृश्यों की समीक्षा करेंगे जहां हमें डिफ़ॉल्ट कॉलेशन को बदलना पड़ सकता है। आप परिस्थितियों का सामना कर सकते हैं, जब सर्वर या डेटाबेस आपको सौंप दिए जाते हैं और हो सकता है कि वे आपकी मानक नीतियों को पूरा नहीं कर रहे हों, इसलिए आपको संयोजन बदलने की आवश्यकता हो सकती है। डिफ़ॉल्ट SQL सर्वर संयोजन SQL_Latin1_General_CP1_CI_AS है। एसक्यूएल इंस्टेंस स्तर पर संयोजन बदलना सीधे आगे नहीं है। इसके लिए उपयोगकर्ता डेटाबेस में सभी ऑब्जेक्ट्स को स्क्रिप्ट करना, डेटा निर्यात करना, उपयोगकर्ता डेटाबेस छोड़ना, नए संयोजन के साथ मास्टर डेटाबेस का पुनर्निर्माण करना, उपयोगकर्ता डेटाबेस बनाना और फिर सभी डेटा आयात करना आवश्यक है। इसलिए, यदि आप नए SQL इंस्टेंस स्थापित कर रहे हैं, तो सुनिश्चित करें कि आपको पहली बार सही मिलान मिल गया है, अन्यथा, आपको बाद में बहुत सारे अवांछित कार्य करने पड़ सकते हैं। प्रत्येक चरण के लिए आवश्यक विस्तृत चरणों के कारण इंस्टेंस स्तर पर मिलान बदलने के चरणों के बारे में विस्तार से बताना इस लेख के दायरे से बाहर है।

डेटाबेस स्तर पर मिलान बदलना

सौभाग्य से, डेटाबेस स्तर के संयोजन को बदलना उतना कठिन नहीं है जितना कि उदाहरण के संयोजन को बदलना। हम एसएसएमएस और टी-एसक्यूएल दोनों का उपयोग करके संयोजन को अपडेट कर सकते हैं। एसएसएमएस में, बस डेटाबेस पर राइट-क्लिक करें, "गुण" पर जाएं और बाईं ओर "विकल्प" टैब पर क्लिक करें। वहां, आप ड्रॉप-डाउन मेनू में कोलेशन बदलने का विकल्प देख सकते हैं।

एक बार हो जाने पर "ओके" पर क्लिक करें। मैंने अभी-अभी डेटाबेस संयोजन को SQL_Latin1_General_CP1_CI_AS में बदला है। बस सुनिश्चित करें कि आप इस ऑपरेशन को तब करते हैं जब डेटाबेस उपयोग में नहीं होता है क्योंकि ऑपरेशन विफल हो जाएगा जैसा कि नीचे दिखाया गया है।

T-SQL का उपयोग करके डेटाबेस संयोजन को बदलने के लिए कार्यवाही क्वेरी का उपयोग करें।

USE master;  
GO  
ALTER DATABASE mo  
COLLATE SQL_Latin1_General_CP1_CS_AS;  
GO

आप देखेंगे कि डेटाबेस स्तर के संयोजन को बदलने से तालिकाओं में मौजूदा स्तंभों का मिलान प्रभावित नहीं होगा। आप नीचे दिए गए प्रश्नों के क्रम पर मिलान के प्रभाव की जांच करने के लिए पहले के उदाहरणों का उपयोग कर सकते हैं।

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS 
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS – - this is default

fname कॉलम कोलेशन मूल बना रहेगा और डेटाबेस लेवल कॉलेशन को बदलने के बाद भी अपरिवर्तित रहेगा।

हालाँकि, नया डेटाबेस स्तर संयोजन आपके द्वारा बनाए जाने वाली नई तालिकाओं में सभी नए स्तंभों के लिए लागू किया जाएगा। इसलिए, हमेशा डेटाबेस कोलाजेशन के परिवर्तन का अच्छी तरह से परीक्षण करें क्योंकि इसका क्वेरी आउटपुट या व्यवहार पर काफी प्रभाव पड़ता है।

स्तंभ स्तर पर मिलान बदलना

पिछले खंड में, आपने देखा कि डेटाबेस स्तर के संयोजन को बदलने के बाद भी, तालिकाओं में मौजूदा स्तंभों का संयोजन अपरिवर्तित रहता है। इस खंड में, हम देखेंगे कि हम डेटाबेस के मिलान से मेल खाने के लिए तालिकाओं में मौजूदा कॉलम के संयोजन को कैसे बदल सकते हैं। पिछले अनुभाग में, आपने डेटाबेस संयोजन को SQL_Latin1_General_CP1_CS_AS में बदल दिया था। इसके बाद, आप उपयोगकर्ता तालिका में उन सभी स्तंभों की पहचान करना चाहते हैं जो इस डेटाबेस संयोजन से मेल नहीं खाते हैं। आप उन स्तंभों की पहचान करने के लिए इस स्क्रिप्ट का उपयोग कर सकते हैं।

select so.name TableName,sc.name ColumnName, sc.collation_name CollationName from
sys.objects so inner join sys.columns sc on so.object_id=sc.object_id
where sc.collation_name!='SQL_Latin1_General_CP1_CS_AS' and so.[type] ='U'

मेरे डेमो डेटाबेस से नमूना आउटपुट नीचे दिखाया गया है।

मान लीजिए कि आप मौजूदा fname कॉलम के संयोजन को "SQL_Latin1_General_CP1_CS_AS" में बदलना चाहते हैं, तो आप नीचे इस परिवर्तन स्क्रिप्ट का उपयोग कर सकते हैं।

use mo
go
ALTER TABLE dbo.emp ALTER COLUMN fname  
            nvarchar(20) COLLATE SQL_Latin1_General_CP1_CS_AS NULL;  
GO

यदि आप पहले के उदाहरणों का उपयोग करते हैं जहां आपने विभिन्न कॉलेशन का उपयोग करके क्वेरी प्रदर्शन की जांच की है, तो आप देखेंगे कि "कंप्यूट स्केलर" ऑपरेटर का उपयोग नहीं किया जाता है जब हम डेटाबेस के समान कॉलेशन का उपयोग करते हैं। नीचे स्क्रीनशॉट का संदर्भ लें। पहले के उदाहरण में, आप देख सकते थे कि पहली निष्पादन योजना में "कंप्यूट स्केलर" ऑपरेटर का उपयोग किया जा रहा है। चूंकि हमने डेटाबेस संयोजन से मिलान करने के लिए कॉलम संयोजन को बदल दिया है, इसलिए अंतर्निहित रूपांतरण की कोई आवश्यकता नहीं है। आप दूसरी क्वेरी में "कंप्यूट स्केलर" ऑपरेटर देखेंगे क्योंकि यह स्पष्ट रूप से एक अलग संयोजन का उपयोग करता है।

select * from emp order by fname collate SQL_Latin1_General_CP1_CS_AS – - this is default
select * from emp order by fname collate SQL_Latin1_General_CP1_CI_AS

क्या हम सिस्टम डेटाबेस के संयोजन को बदल सकते हैं?

सिस्टम डेटाबेस के संयोजन को बदलना संभव नहीं है। यदि आप सिस्टम डेटाबेस - मास्टर, मॉडल, msdb या tempdb के संयोजन को बदलने का प्रयास करते हैं, तो आपको यह त्रुटि संदेश प्राप्त होगा।

सिस्टम डेटाबेस के संयोजन को बदलने के लिए आपको SQL सर्वर आवृत्ति स्तर पर कॉलेशन बदलने पर पहले बताए गए चरणों का पालन करना होगा। इस तरह की समस्याओं से बचने के लिए पहली बार SQL सर्वर स्थापित करते समय कोलाज को सही करना महत्वपूर्ण है।

संयोजन संघर्ष के बारे में ज्ञात समस्या

एक अन्य सामान्य समस्या जो आपको मिल सकती है, वह है विशेष रूप से अस्थायी वस्तुओं का उपयोग करते समय संयोजन संघर्ष से संबंधित त्रुटि। अस्थायी वस्तुओं को tempdb में संग्रहीत किया जाता है। एक सिस्टम डेटाबेस होने के नाते tempdb SQL इंस्टेंस के संयोजन को मान लेगा। जब आप SQL इंस्टेंस के अलावा अन्य संयोजन वाले उपयोगकर्ता डेटाबेस बनाते हैं, तो आप अस्थायी ऑब्जेक्ट्स का उपयोग करते समय समस्याओं में भाग लेंगे। अलग-अलग कॉलेशन वाली तालिकाओं में स्तंभों की तुलना करते समय आपको समस्याओं का भी सामना करना पड़ सकता है। अब तक, आप पहले से ही जानते हैं कि एक टेबल में अलग-अलग कॉलेशन वाले कॉलम हो सकते हैं क्योंकि हम टेबल लेवल पर कॉलेशन को नहीं बदल सकते हैं। आप देखेंगे कि सामान्य त्रुटि संदेश कुछ ऐसा है जैसे "संचालन के बराबर" "Collation1" और "Collation2" के बीच टकराव को हल नहीं कर सकता। Collation1 और Collation2 किसी क्वेरी में उपयोग किया जाने वाला कोई भी संयोजन हो सकता है। एक सरल उदाहरण का उपयोग करके, हम इस टकराव का एक डेमो तैयार कर सकते हैं। यदि आपने इस लेख में पिछले उदाहरणों को पूरा कर लिया है, तो आपके पास पहले से ही "एम्प" नाम की एक तालिका होगी। बस अपने डेमो डेटाबेस में एक अस्थायी तालिका बनाएं और प्रदान की गई नमूना स्क्रिप्ट का उपयोग करके रिकॉर्ड डालें।

create table #emptemp
(id int,
 fname nvarchar(20))

insert into  #emptemp
select * from emp

बस दोनों टेबलों का उपयोग करके एक जॉइन चलाएं और आपको नीचे दिखाए गए अनुसार यह संयोजन संघर्ष त्रुटि मिलेगी।

select e.id, et.fname 
from emp e inner join #emptemp et
on e.fname=et.fname
से चुनें

आप देखेंगे कि उपयोग किया गया उपयोगकर्ता डेटाबेस संयोजन "SQL_Latin1_General_CP1_CS_AS" है और यह सर्वर संयोजन से मेल नहीं खाता है। इस प्रकार की त्रुटि को ठीक करने के लिए, आप उपयोगकर्ता डेटाबेस के डिफ़ॉल्ट संयोजन का उपयोग करने के लिए अस्थायी ऑब्जेक्ट्स में उपयोग किए जाने वाले कॉलम को बदल सकते हैं। आप "डेटाबेस_डिफॉल्ट" विकल्प का उपयोग कर सकते हैं या स्पष्ट रूप से उपयोगकर्ता डेटाबेस का संयोजन नाम प्रदान कर सकते हैं। इस उदाहरण में, हम "SQL_Latin1_General_CP1_CS_AS" संयोजन का उपयोग करते हैं। इनमें से कोई एक विकल्प आज़माएं
विकल्प 1: डेटाबेस_डिफॉल्ट विकल्प का उपयोग करें

alter table #emptemp alter column
 fname nvarchar(20) collate database_default

एक बार हो जाने के बाद, चयन कथन को फिर से चलाएँ और त्रुटि ठीक हो जाएगी।
विकल्प 2: उपयोगकर्ता डेटाबेस के संयोजन का स्पष्ट रूप से उपयोग करें

alter table #emptemp alter column
 fname nvarchar(20) collate SQL_Latin1_General_CP1_CS_AS

एक बार हो जाने के बाद, चयन कथन को फिर से चलाएँ और त्रुटि ठीक हो जाएगी।

निष्कर्ष

इस लेख में, आपने पाया:
• संयोजन की अवधारणा
• उपलब्ध विभिन्न संयोजन विकल्प
• किसी भी SQL उदाहरण, डेटाबेस और स्तंभ के लिए मिलान विवरण ढूँढना
• A SQL क्वेरी में कोलेशन विकल्पों को आज़माने के लिए काम करने का उदाहरण
• इंस्टेंस स्तर, डेटाबेस स्तर और कॉलम स्तर पर कॉलेशन बदलना
• सिस्टम डेटाबेस के कॉलेशन को कैसे बदलें
• एक कॉलेशन संघर्ष और कैसे इसे ठीक करने के लिए

अब आप कोलेशन के महत्व और SQL इंस्टेंस पर और डेटाबेस ऑब्जेक्ट्स में सही कॉलेशन को कॉन्फ़िगर करने की महत्वपूर्णता के बारे में जानते हैं। अपने उत्पादन सिस्टम पर उपरोक्त विकल्पों में से कोई भी लागू करने से पहले हमेशा अपने परीक्षण वातावरण पर विभिन्न परिदृश्यों का परीक्षण करें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पंक्तियों को ठीक उसी क्रम में लौटाएं जैसे उन्हें डाला गया था

  2. SQL सर्वर में वर्तमान सत्र के लिए दिनांक स्वरूप बदलें

  3. एसक्यूएल-सर्वर के लिए एक चर में गतिशील एसक्यूएल का परिणाम प्राप्त करना

  4. डेटाबेस में सभी टेबल के लिए ड्रॉप टेबल स्टेटमेंट कैसे जेनरेट करें - SQL सर्वर / T-SQL ट्यूटोरियल पार्ट 48

  5. SQL सर्वर 2016:हमेशा एन्क्रिप्टेड का प्रदर्शन प्रभाव