SQL 2005 [SQL_Latin1_General_CP1_CI_AS] से 2008 तक चलना - क्या मैं 'पश्चगामी संगतता' का उपयोग करके किसी भी सुविधा को खो दूंगा


18

हम SQL 2005 से आगे बढ़ रहे हैं [इंस्टेंस और DB का टकराव SQL_Latin1_General_CP1_CI_AS] SQL 2008 तक [[जो डिफॉल्ट करता है Latin1_General_CI_AS]।

मैंने SQL 2008 R2 स्थापना पूर्ण की, और डिफ़ॉल्ट Latin1_General_CI_ASटकराने का उपयोग किया , डेटाबेस की बहाली अभी भी साथ है SQL_Latin1_General_CP1_CI_AS। अपवादित समस्याएं उत्पन्न हुईं - # टैम्प टेबल, जहां Latin1_General_CI_ASडीबी अंदर था SQL_Latin1_General_CP1_CI_ASऔर यह वह जगह है जहां मैं अभी हूं - मुझे कृपया अब नुकसान की सलाह चाहिए।

एसक्यूएल 2008 R2 की स्थापना पर, मैं उपयोग करने के लिए स्थापना पर विकल्प होता है 'SQL Collation, used for backwards compatibility'जहां 2005 डेटाबेस के रूप में ही मिलान चुनने का विकल्प है: SQL_Latin1_General_CP1_CI_AS

  1. यह मुझे # टैम्प टेबल के साथ समस्या नहीं होने देगा, लेकिन क्या कुछ नुकसान हैं?

  2. क्या मैं एसक्यूएल 2008 के "वर्तमान" टकराव का उपयोग नहीं करके किसी भी प्रकार की किसी भी कार्यक्षमता या सुविधाओं को खो दूंगा?

  3. जब हम 2008 से एसक्यूएल 2012 में चलते हैं (जैसे 2 साल में) तो क्या होगा? क्या मुझे तब समस्या होगी?
  4. क्या मैं किसी बिंदु पर जाने के लिए मजबूर होऊंगा Latin1_General_CI_AS?

  5. मैंने पढ़ा कि कुछ डीबीए की स्क्रिप्ट पूर्ण डेटाबेस की पंक्तियों को पूरा करती है, और फिर सम्मिलित स्क्रिप्ट को नए कोलाज के साथ डेटाबेस में चलाती है - मैं बहुत डरा हुआ हूं और इससे सावधान हूं - क्या आप ऐसा करने की सिफारिश करेंगे?


2
यदि आपको लगता है कि आप SQL सर्वर 2014 में हेकोटन में मिल सकते हैं, तो यहां कुछ और है जिसे आप पढ़ने पर विचार करना चाह सकते हैं
हारून बर्ट्रेंड

जवाबों:


20

सबसे पहले, इतने लंबे उत्तर के लिए क्षमा याचना, जैसा कि मुझे लगता है कि अभी भी बहुत भ्रम है जब लोग टकराव, सॉर्ट ऑर्डर, कोड पृष्ठ, आदि जैसे शब्दों के बारे में बात करते हैं।

से बोल :

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 के सुझाव के साथ इनलाइन होना अच्छा होता है + आपको अपने डेटा और मेरे द्वारा बताए गए नुकसानों को समझने की जरूरत है। इसके अलावा का उल्लेख इस और इस कनेक्ट आइटम नहीं है।

मैंने पढ़ा कि कुछ डीबीए की स्क्रिप्ट पूर्ण डेटाबेस की पंक्तियों को पूरा करती है, और फिर सम्मिलित स्क्रिप्ट को नए कोलाज के साथ डेटाबेस में चलाती है - मैं बहुत डरा हुआ हूं और इससे सावधान हूं - क्या आप ऐसा करने की सिफारिश करेंगे?

जब आप टकराव को बदलना चाहते हैं, तो ऐसी स्क्रिप्ट उपयोगी होती हैं। मैंने कई बार सर्वर कोलाज से मिलान करने के लिए खुद को डेटाबेसों के बदलते हुए पाया है और मेरे पास कुछ स्क्रिप्ट हैं जो इसे बहुत साफ करती हैं। अगर जरूरत हो तो मुझे बताएं।

संदर्भ:


5

@Kin ने अपने उत्तर में जो विस्तृत किया है , इसके अलावा , सर्वर के स्विचिंग के समय (यानी उदाहरण के) डिफ़ॉल्ट टकराने (हॉरिजॉन्टल लाइन के ऊपर आइटम सीधे प्रश्न में उल्लिखित दो टकरावों के लिए प्रासंगिक हैं); नीचे की क्षैतिज रेखा सामान्य से प्रासंगिक है):

  • यदि आपका डेटा डिफाल्ट कॉलिंग चेंजिंग नहीं है , तो @ किन के उत्तर में वर्णित "निहित रूपांतरण" प्रदर्शन समस्या एक समस्या नहीं होनी चाहिए क्योंकि स्ट्रिंग शाब्दिक और स्थानीय चर डेटाबेस के डिफ़ॉल्ट Collation का उपयोग करते हैं, सर्वर का नहीं। परिदृश्य के लिए एकमात्र प्रभाव जिसमें उदाहरण स्तर Collation बदला गया है, लेकिन डेटाबेस स्तर Collation नहीं हैं (दोनों नीचे विस्तार से वर्णित हैं:

    • संभावित टकराव अस्थायी तालिकाओं (लेकिन तालिका चर नहीं) के साथ संघर्ष करता है।
    • संभावित टूटे हुए कोड यदि चर और / या कर्सर के आवरण उनकी घोषणाओं से मेल नहीं खाते हैं (लेकिन यह केवल तब हो सकता है जब द्विआधारी या मामले के प्रति संवेदनशील टकराव के साथ एक उदाहरण पर जा रहा है)।
  • इन दो Collations के बीच एक अंतर यह है कि वे VARCHARडेटा के लिए कुछ वर्णों को कैसे सॉर्ट करते हैं (यह NVARCHARडेटा को प्रभावित नहीं करता है)। गैर- EBCDIC SQL_Collations VARCHAR, डेटा के लिए "String Sort" कहलाता है , जबकि अन्य सभी Collations और NVARCHARगैर-EBCDIC SQL_Collations के लिए भी डेटा का उपयोग करते हैं, जिसे "Word Sort" कहा जाता है। अंतर यह है कि "वर्ड सॉर्ट" में, डैश -और एपोस्ट्रोफ '(और शायद कुछ अन्य वर्ण?) को बहुत कम वजन दिया जाता है और अनिवार्य रूप से अनदेखा किया जाता है जब तक कि तारों में कोई अन्य अंतर नहीं होता है। कार्रवाई में इस व्यवहार को देखने के लिए, निम्नलिखित चलाएं:

    DECLARE @Test TABLE (Col1 VARCHAR(10) NOT NULL);
    INSERT INTO @Test VALUES ('aa');
    INSERT INTO @Test VALUES ('ac');
    INSERT INTO @Test VALUES ('ah');
    INSERT INTO @Test VALUES ('am');
    INSERT INTO @Test VALUES ('aka');
    INSERT INTO @Test VALUES ('akc');
    INSERT INTO @Test VALUES ('ar');
    INSERT INTO @Test VALUES ('a-f');
    INSERT INTO @Test VALUES ('a_e');
    INSERT INTO @Test VALUES ('a''kb');
    
    SELECT * FROM @Test ORDER BY [Col1] COLLATE SQL_Latin1_General_CP1_CI_AS;
    -- "String Sort" puts all punctuation ahead of letters
    
    SELECT * FROM @Test ORDER BY [Col1] COLLATE Latin1_General_100_CI_AS;
    -- "Word Sort" mostly ignores dash and apostrophe

    यह दिखाता है:

    String Sort
    -----------
    a'kb
    a-f
    a_e
    aa
    ac
    ah
    aka
    akc
    am
    ar

    तथा:

    Word Sort
    ---------
    a_e
    aa
    ac
    a-f
    ah
    aka
    a'kb
    akc
    am
    ar

    जब आप "स्ट्रिंग क्रमबद्ध" व्यवहार को "खो देंगे", मुझे यकीन नहीं है कि मैं इसे "फीचर" कहूंगा। यह एक ऐसा व्यवहार है जिसे अवांछनीय माना गया है (जैसा कि इस तथ्य से स्पष्ट है कि इसे विंडोज के किसी भी संघटन में आगे नहीं लाया गया था)। हालाँकि, यह दो समतलों (फिर से, गैर-EBCDIC डेटा के लिए) के बीच व्यवहार का एक निश्चित अंतर है VARCHAR, और आपको "स्ट्रिंग क्रमबद्ध" व्यवहार के आधार पर कोड और / या ग्राहक अपेक्षाएं हो सकती हैं। इसके लिए अपने कोड के परीक्षण की आवश्यकता होती है और संभवतः यह देखने के लिए शोध किया जाता है कि क्या व्यवहार में यह परिवर्तन उपयोगकर्ताओं पर कोई नकारात्मक प्रभाव डाल सकता है।

  • बीच एक और अंतर SQL_Latin1_General_CP1_CI_ASऔर Latin1_General_100_CI_ASऐसा करने की क्षमता है विस्तार पर VARCHARडेटा ( NVARCHARडेटा पहले से ही अधिकांश के लिए इन कर सकते हैं SQL_इस तरह के रख-रखाव के रूप में collations), æके रूप में अगर यह थे ae:

    IF ('æ' COLLATE SQL_Latin1_General_CP1_CI_AS =
        'ae' COLLATE SQL_Latin1_General_CP1_CI_AS)
    BEGIN
      PRINT 'SQL_Latin1_General_CP1_CI_AS';
    END;
    
    IF ('æ' COLLATE Latin1_General_100_CI_AS =
        'ae' COLLATE Latin1_General_100_CI_AS)
    BEGIN
      PRINT 'Latin1_General_100_CI_AS';
    END;

    यह दिखाता है:

    Latin1_General_100_CI_AS

    केवल एक चीज जिसे आप "खो रहे हैं" यहाँ ये विस्तार करने में सक्षम नहीं है । सामान्यतया, यह विंडोज कोलेशन में जाने का एक और लाभ है। हालाँकि, "शब्द क्रमबद्ध" चाल के लिए "स्ट्रिंग क्रमबद्ध" के साथ, एक ही सावधानी लागू होती है: यह दो समतलों (फिर से, केवल VARCHARडेटा के लिए) के बीच व्यवहार का एक निश्चित अंतर है , और आपके पास कोड और / या ग्राहक हो सकता है। इन मैपिंग के होने के आधार पर अपेक्षाएँ । इसके लिए अपने कोड के परीक्षण की आवश्यकता होती है और संभवतः यह देखने के लिए शोध किया जाता है कि क्या व्यवहार में यह परिवर्तन उपयोगकर्ताओं पर कोई नकारात्मक प्रभाव डाल सकता है।

    (पहले इस SO उत्तर में @Zarepheth द्वारा उल्लेख किया गया: क्या SQL Server SQL_Latin1_General_CP1_CI_AS को सुरक्षित रूप से Latin1_General_CI_AS में परिवर्तित किया जा सकता है? )

  • सर्वर-लेवल कॉलेलेशन का उपयोग सिस्टम डेटाबेस के कॉलेशन को सेट करने के लिए किया जाता है, जिसमें शामिल हैं [model][model]डेटाबेस नए डेटाबेस बनाने के लिए, जिसमें शामिल है एक टेम्पलेट के रूप में किया जाता है [tempdb]प्रत्येक सर्वर स्टार्टअप पर। लेकिन, सर्वर-लेवल कॉलेलेशन के बदलने के साथ-साथ कॉलेशन को बदलने पर भी [tempdb], डेटाबेस के बीच कॉलेशन के अंतर को ठीक करने का एक आसान तरीका है जो CREATE #TempTableनिष्पादित होने पर "चालू" होता है और [tempdb]। अस्थायी तालिकाएँ बनाते समय, COLLATEक्लॉज़ का उपयोग करके एक कॉलेशन घोषित करें और एक कॉलेशन निर्दिष्ट करें DATABASE_DEFAULT:

    CREATE TABLE #Temp (Col1 NVARCHAR(40) COLLATE DATABASE_DEFAULT);

  • यदि वांछित कई संस्करण उपलब्ध हैं, तो सबसे हाल के संस्करण का उपयोग करना सबसे अच्छा है। SQL सर्वर 2005 में शुरू, "90" श्रृंखलाओं की एक श्रृंखला शुरू की गई थी, और SQL Server 2008 में "100" श्रृंखलाओं की श्रृंखला शुरू की गई थी। आप निम्न प्रश्नों का उपयोग करके इन कोलाज़ों को पा सकते हैं:

    SELECT * FROM sys.fn_helpcollations() WHERE [name] LIKE N'%[_]90[_]%'; -- 476
    
    SELECT * FROM sys.fn_helpcollations() WHERE [name] LIKE N'%[_]100[_]%'; -- 2686

    चूंकि आप SQL Server 2008 R2 पर हैं, इसलिए आपको Latin1_General_100_CI_ASइसके बजाय उपयोग करना चाहिए Latin1_General_CI_AS

  • इन विशेष collations (यानी की केस-संवेदी संस्करणों के बीच एक अंतर SQL_Latin1_General_CP1_CS_ASऔर Latin1_General_100_CS_AS) अपर-केस के क्रम में है और लोअर केस जब केस-संवेदी छंटाई कर पत्र। यह एकल-वर्ण वर्ग श्रेणी (यानी [start-end]) को भी प्रभावित करता है जिसका उपयोग LIKEऑपरेटर और PATINDEXफ़ंक्शन के साथ किया जा सकता है । निम्नलिखित तीन प्रश्न छँटाई और वर्ण श्रेणी दोनों के लिए यह प्रभाव दिखाते हैं।

    SELECT tmp.col AS [Upper-case first]
    FROM (VALUES ('a'), ('A'), ('b'), ('B'), ('c'), ('C')) tmp(col)
    WHERE tmp.col LIKE '%[A-C]%' COLLATE SQL_Latin1_General_CP1_CS_AS
    ORDER BY tmp.col COLLATE SQL_Latin1_General_CP1_CS_AS; -- Upper-case first
    
    SELECT tmp.col AS [Lower-case first]
    FROM (VALUES ('a'), ('A'), ('b'), ('B'), ('c'), ('C')) tmp(col)
    WHERE tmp.col LIKE '%[A-C]%' COLLATE Latin1_General_100_CS_AS
    ORDER BY tmp.col COLLATE Latin1_General_100_CS_AS; -- Lower-case first
    
    SELECT tmp.col AS [Lower-case first]
    FROM (VALUES (N'a'), (N'A'), (N'b'), (N'B'), (N'c'), (N'C')) tmp(col)
    WHERE tmp.col LIKE N'%[A-C]%' COLLATE SQL_Latin1_General_CP1_CS_AS
    ORDER BY tmp.col COLLATE SQL_Latin1_General_CP1_CS_AS; -- Lower-case first

    निचले-मामले से पहले सॉर्ट करने के लिए ऊपरी-केस प्राप्त करने का एकमात्र तरीका (उसी पत्र के लिए) उस व्यवहार का समर्थन करने वाले 31 Collations में से एक का उपयोग करना है, जो Hungarian_Technical_*Coll Collations और मुट्ठी भर SQL_Collations है (जो केवल VARCHARडेटा के लिए इस व्यवहार का समर्थन करते हैं )।

  • इस विशेष बदलाव के लिए कम महत्वपूर्ण, लेकिन फिर भी यह जानना अच्छा है कि सर्वर को बाइनरी या केस-सेंसिटिव कॉलेशन में बदलने से यह प्रभावित होगा, क्या सर्वर स्तर का कोलाज भी प्रभावित होता है:

    • स्थानीय चर नाम
    • कूर्स नाम
    • गोटो लेबल
    • sysnameडेटाटाइप का नाम रिज़ॉल्यूशन


    मतलब, अगर आप या "प्रोग्रामर जिसने हाल ही में छोड़ा था" जो सभी बुरे कोड के लिए स्पष्ट रूप से जिम्मेदार है; ;-) के बारे में सावधान नहीं थे और एक वैरिएबल घोषित किया था, @SomethingIDलेकिन फिर @somethingIdबाद में इसे संदर्भित कर दिया , जो किसी मामले में जाने पर टूट जाएगा -संसिटिव या बाइनरी कॉलेशन। इसी तरह, कोड का उपयोग करता है sysnameडेटाप्रकार लेकिन के रूप में यह करने के लिए संदर्भित करता है SYSNAME, SysNameया सभी लोअर केस से कुछ अन्य भी अगर एक केस-संवेदी या बाइनरी मिलान का उपयोग कर एक उदाहरण के लिए ले जाया टूट जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.