सबसे पहले, इतने लंबे उत्तर के लिए क्षमा याचना, जैसा कि मुझे लगता है कि अभी भी बहुत भ्रम है जब लोग टकराव, सॉर्ट ऑर्डर, कोड पृष्ठ, आदि जैसे शब्दों के बारे में बात करते हैं।
से बोल :
SQL सर्वर में Collations आपके डेटा के लिए सॉर्टिंग नियम, केस और उच्चारण संवेदनशीलता गुण प्रदान करते हैं । वर्ण डेटा प्रकारों जैसे कि char और varchar के साथ उपयोग किए जाने वाले कोलाज़ कोड पृष्ठ और संबंधित वर्णों को निर्धारित करते हैं जिन्हें उस डेटा प्रकार के लिए दर्शाया जा सकता है। चाहे आप SQL सर्वर का एक नया उदाहरण स्थापित कर रहे हों, डेटाबेस बैकअप को पुनर्स्थापित कर रहे हों, या सर्वर को क्लाइंट डेटाबेस से जोड़ रहे हों, यह महत्वपूर्ण है कि आप स्थानीय आवश्यकताओं को समझें, क्रमबद्धता, और डेटा के मामले और उच्चारण संवेदनशीलता जिसे आप के साथ काम करेंगे। ।
इसका मतलब यह है कि Collation बहुत महत्वपूर्ण है क्योंकि यह नियमों को निर्दिष्ट करता है कि कैसे डेटा के वर्ण स्ट्रिंग को क्रमबद्ध और तुलना किया जाता है।
नोट: COLLATIONPROPERTY पर अधिक जानकारी
अब पहले मतभेदों को समझें ......
टी-एसक्यूएल से नीचे चल रहा है:
SELECT *
FROM::fn_helpcollations()
WHERE NAME IN (
'SQL_Latin1_General_CP1_CI_AS'
,'Latin1_General_CI_AS'
)
GO
SELECT 'SQL_Latin1_General_CP1_CI_AS' AS 'Collation'
,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'CodePage') AS 'CodePage'
,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'LCID') AS 'LCID'
,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'ComparisonStyle') AS 'ComparisonStyle'
,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'Version') AS 'Version'
UNION ALL
SELECT 'Latin1_General_CI_AS' AS 'Collation'
,COLLATIONPROPERTY('Latin1_General_CI_AS', 'CodePage') AS 'CodePage'
,COLLATIONPROPERTY('Latin1_General_CI_AS', 'LCID') AS 'LCID'
,COLLATIONPROPERTY('Latin1_General_CI_AS', 'ComparisonStyle') AS 'ComparisonStyle'
,COLLATIONPROPERTY('Latin1_General_CI_AS', 'Version') AS 'Version'
GO
परिणाम होंगे:
उपरोक्त परिणामों को देखते हुए, केवल अंतर 2 टकरावों के बीच क्रमबद्ध क्रम है। लेकिन यह सच नहीं है, जिसे आप नीचे देख सकते हैं:
टेस्ट 1:
--Clean up previous query
IF OBJECT_ID('Table_Latin1_General_CI_AS') IS NOT NULL
DROP TABLE Table_Latin1_General_CI_AS;
IF OBJECT_ID('Table_SQL_Latin1_General_CP1_CI_AS') IS NOT NULL
DROP TABLE Table_SQL_Latin1_General_CP1_CI_AS;
-- Create a table using collation Latin1_General_CI_AS
CREATE TABLE Table_Latin1_General_CI_AS (
ID INT IDENTITY(1, 1)
,Comments VARCHAR(50) COLLATE Latin1_General_CI_AS
)
-- add some data to it
INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('kin_test1')
INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('Kin_Tester1')
-- Create second table using collation SQL_Latin1_General_CP1_CI_AS
CREATE TABLE Table_SQL_Latin1_General_CP1_CI_AS (
ID INT IDENTITY(1, 1)
,Comments VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS
)
-- add some data to it
INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('kin_test1')
INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('Kin_Tester1')
--Now try to join both tables
SELECT *
FROM Table_Latin1_General_CI_AS LG
INNER JOIN Table_SQL_Latin1_General_CP1_CI_AS SLG ON LG.Comments = SLG.Comments
GO
टेस्ट 1 के परिणाम:
Msg 468, Level 16, State 9, Line 35
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.
उपरोक्त परिणामों से हम देख सकते हैं कि हम विभिन्न कॉलमों वाले कॉलमों के मूल्यों की सीधे तुलना नहीं कर सकते, आपको COLLATE
कॉलम के मूल्यों की तुलना करने के लिए उपयोग करना होगा।
परीक्षण 2:
मुख्य अंतर प्रदर्शन है, जैसा कि एर्लैंड सोमरस्कोग एमएसएनएन पर इस चर्चा में बताते हैं ।
--Clean up previous query
IF OBJECT_ID('Table_Latin1_General_CI_AS') IS NOT NULL
DROP TABLE Table_Latin1_General_CI_AS;
IF OBJECT_ID('Table_SQL_Latin1_General_CP1_CI_AS') IS NOT NULL
DROP TABLE Table_SQL_Latin1_General_CP1_CI_AS;
-- Create a table using collation Latin1_General_CI_AS
CREATE TABLE Table_Latin1_General_CI_AS (
ID INT IDENTITY(1, 1)
,Comments VARCHAR(50) COLLATE Latin1_General_CI_AS
)
-- add some data to it
INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('kin_test1')
INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('kin_tester1')
-- Create second table using collation SQL_Latin1_General_CP1_CI_AS
CREATE TABLE Table_SQL_Latin1_General_CP1_CI_AS (
ID INT IDENTITY(1, 1)
,Comments VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS
)
-- add some data to it
INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('kin_test1')
INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('kin_tester1')
--- दोनों टेबल पर इंडेक्स बनाएं
CREATE INDEX IX_LG_Comments ON Table_Latin1_General_CI_AS(Comments)
go
CREATE INDEX IX_SLG_Comments ON Table_SQL_Latin1_General_CP1_CI_AS(Comments)
--- प्रश्नों को चलाएं
DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_Latin1_General_CI_AS WHERE Comments = 'kin_test1'
GO
--- इसमें IMPLICIT रूपांतरण होगा
--- प्रश्नों को चलाएं
DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_SQL_Latin1_General_CP1_CI_AS WHERE Comments = 'kin_test1'
GO
--- इसमें IMPLICIT रूपांतरण नहीं होगा
अंतर्निहित रूपांतरण के लिए कारण है, क्योंकि मैं दोनों के रूप में मेरे डेटाबेस और सर्वर मिलान है SQL_Latin1_General_CP1_CI_AS
और मेज Table_Latin1_General_CI_AS स्तंभ है टिप्पणियाँ के रूप में परिभाषित VARCHAR(50)
के साथ मुक़ाबला Latin1_General_CI_AS , तो देखने एसक्यूएल सर्वर एक अंतर्निहित रूपांतरण करना है के दौरान।
टेस्ट 3:
एक ही सेट अप के साथ, अब हम निष्पादन की योजनाओं में बदलाव देखने के लिए नवरच मान के साथ varchar कॉलम की तुलना करेंगे।
- क्वेरी चलाएँ
DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_Latin1_General_CI_AS WHERE Comments = (SELECT N'kin_test1' COLLATE Latin1_General_CI_AS)
GO
- क्वेरी चलाएँ
DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_SQL_Latin1_General_CP1_CI_AS WHERE Comments = N'kin_test1'
GO
ध्यान दें कि पहली क्वेरी इंडेक्स की तलाश करने में सक्षम है, लेकिन इंप्लसिट रूपांतरण करना है, जबकि दूसरा एक इंडेक्स स्कैन करता है जो प्रदर्शन के मामले में अक्षम साबित होता है जब यह बड़ी तालिकाओं को स्कैन करेगा।
निष्कर्ष:
- उपरोक्त सभी परीक्षणों से पता चलता है कि सही तालमेल होना आपके डेटाबेस सर्वर उदाहरण के लिए बहुत महत्वपूर्ण है।
SQL_Latin1_General_CP1_CI_AS
नियमों के साथ एक एसक्यूएल टकराव है जो आपको यूनिकोड और गैर-यूनिकोड के लिए डेटा सॉर्ट करने की अनुमति देता है।
- यूनिकोड और नॉन-यूनिकोड डेटा की तुलना करते समय एसक्यूएल कॉलेक्शन अभ्यस्त इंडेक्स का उपयोग करने में सक्षम होगा जैसा कि उपरोक्त परीक्षणों में देखा गया है कि जब nvarchar डेटा की तुलना varchar डेटा से की जाती है, तो यह इंडेक्स स्कैन करता है और तलाश नहीं करता है।
Latin1_General_CI_AS
नियमों के साथ एक विंडोज टकराव है जो आपको यूनिकोड और गैर-यूनिकोड के लिए डेटा सॉर्ट करने की अनुमति देता है।
- यूनिकोड और गैर-यूनिकोड डेटा की तुलना करते समय विंडोज कोलाजेशन अभी भी इंडेक्स (उपर्युक्त उदाहरण में इंडेक्स की तलाश) का उपयोग कर सकता है लेकिन आपको मामूली प्रदर्शन जुर्माना लगता है।
- अत्यधिक Erland Sommarskog उत्तर + कनेक्ट की गई वस्तुओं को पढ़ने की सलाह देते हैं जो उसने इंगित की हैं।
यह मुझे # टैम्प टेबल के साथ समस्या नहीं होने देगा, लेकिन क्या कुछ नुकसान हैं?
मेरा जवाब ऊपर देखिए।
क्या मैं एसक्यूएल 2008 के "वर्तमान" टकराव का उपयोग नहीं करके किसी भी प्रकार की किसी भी कार्यक्षमता या सुविधाओं को खो दूंगा?
यह सब इस बात पर निर्भर करता है कि आप किस कार्यक्षमता / सुविधाओं का उल्लेख कर रहे हैं। Collation डेटा का भंडारण और छँटाई कर रहा है।
जब हम 2008 से एसक्यूएल 2012 में चलते हैं (जैसे 2 साल में) तो क्या होगा? क्या मुझे तब समस्या होगी? क्या मैं किसी बिंदु पर लैटिन 1_General_CI_AS पर जाने के लिए मजबूर हो जाऊंगा?
कैंट वाउच! जैसे-जैसे चीजें बदल सकती हैं और Microsoft के सुझाव के साथ इनलाइन होना अच्छा होता है + आपको अपने डेटा और मेरे द्वारा बताए गए नुकसानों को समझने की जरूरत है। इसके अलावा का उल्लेख इस और इस कनेक्ट आइटम नहीं है।
मैंने पढ़ा कि कुछ डीबीए की स्क्रिप्ट पूर्ण डेटाबेस की पंक्तियों को पूरा करती है, और फिर सम्मिलित स्क्रिप्ट को नए कोलाज के साथ डेटाबेस में चलाती है - मैं बहुत डरा हुआ हूं और इससे सावधान हूं - क्या आप ऐसा करने की सिफारिश करेंगे?
जब आप टकराव को बदलना चाहते हैं, तो ऐसी स्क्रिप्ट उपयोगी होती हैं। मैंने कई बार सर्वर कोलाज से मिलान करने के लिए खुद को डेटाबेसों के बदलते हुए पाया है और मेरे पास कुछ स्क्रिप्ट हैं जो इसे बहुत साफ करती हैं। अगर जरूरत हो तो मुझे बताएं।
संदर्भ: