N'Nc ने Latin1_General_CI_AS टक्कर का उपयोग करके N'C की डुप्लिकेट कुंजी मानी


11

मेरे पास एक अद्वितीय कुंजी के साथ एक तालिका है जिसमें एक NVARCHAR(50)कॉलम (सही या नहीं, लेकिन वहां है) शामिल है। तो, जब सम्मिलित करने की कोशिश की जा रही है Șcया C( डालने के क्रम पर कोई फर्क नहीं पड़ता) तो यह कोलाज के मुद्दों के कारण 2 वें सम्मिलित पर टूट जाता है। यहाँ त्रुटि है:

(1 पंक्ति (ओं) प्रभावित) Msg 2601, स्तर 14, राज्य 1, पंक्ति 16 अद्वितीय सूचकांक 'IX_TestT' के साथ ऑब्जेक्ट 'dbo.testT' में डुप्लिकेट कुंजी पंक्ति सम्मिलित नहीं कर सकता। डुप्लिकेट कुंजी मान (C) है।

रिटर्न का चयन करें:

यहाँ छवि विवरण दर्ज करें

डाटाबेस डिफ़ॉल्ट मिलान है Latin1_General_CI_AS। पहले से मौजूद संरचना को बहुत अधिक बदलने के बिना, इसे हल करने के तरीके को देखने में कुछ समय बिताया, लेकिन काम करने का एक तरीका नहीं मिल सकता है। अलग-अलग टकराव और संयोजन की कोशिश की, सब कुछ विफल हो जाता है। चरित्र विस्तार के बारे में ( यहां और यहां ) पढ़ें , और इसी तरह, अभी भी अटके हुए हैं। यहां एक नमूना कोड है जिसका उपयोग मैं इस समस्या को दोहराने के लिए कर रहा हूं, जो कुछ भी इसे सुलझाने में मदद कर सकता है उसे संशोधित करने और सिफारिश करने के लिए स्वतंत्र महसूस करें।

CREATE TABLE testT (
    [Default_Collation]     [NVARCHAR] (50) COLLATE DATABASE_DEFAULT,
    [Latin1_General_CI_AS]  [NVARCHAR] (50) COLLATE Latin1_General_CI_AS,
    [Latin1_General_CI_AI]  [NVARCHAR] (50) COLLATE Latin1_General_CI_AI,
    [SQL_Collation]         [NVARCHAR] (50) COLLATE SQL_Latin1_General_CP1_CI_AS);
CREATE UNIQUE CLUSTERED INDEX [IX_TestT] ON [dbo].[testT] ([Default_Collation])
ON [PRIMARY]
GO

INSERT INTO testT
SELECT  N'Șc',  --COLLATE Latin1_General_CI_AS
        N'Șc',  --COLLATE Latin1_General_CI_AS
        N'Șc',  --COLLATE Latin1_General_CI_AS
        N'Șc'   --COLLATE Latin1_General_CI_AS

INSERT INTO testT
SELECT  N'C'    --COLLATE Latin1_General_CI_AS 
        ,N'C'   --COLLATE Latin1_General_CI_AS
        ,N'C'   --COLLATE Latin1_General_CI_AS
        ,N'C'   --COLLATE SQL_Latin1_General_CP1_CI_AS

SELECT * FROM testT;

DROP TABLE testT;

जवाबों:


10

समस्या यह है कि पुराने SQL सर्वर Collations (यानी जिनके नाम शुरू हो रहे हैं SQL_) और Windows Collations के पहले दो संस्करण ( 80श्रृंखला जो SQL Server 2000 के साथ आए थे और उनके नाम में कोई संस्करण संख्या नहीं है, और 90श्रृंखला जो एसक्यूएल सर्वर 2005 के साथ आया) एक महान कई पात्रों के लिए सॉर्ट वेट को याद कर रहा है। इसे ज्यादातर 100SQL Server 2008 के साथ आने वाले श्रृंखला Collations के साथ शुरू किया गया था ।

जैसा कि आप नीचे दिए गए उदाहरणों में देख सकते हैं कि Șगैर-बाइनरी, संस्करण 80 या 90 Collations (और SQL Server Collations) का उपयोग करते समय चरित्र एक खाली स्ट्रिंग से मेल खाता है क्योंकि दोनों का समान वजन है: 0. कुछ भी नहीं। नाडा। इसका मतलब है कि तुलना करते समय N'Șc'के साथ N'C'(पूर्व श्रृंखला 100 collations का प्रयोग करके), तुम सच में तुलना कर रहे हैं N'c'के साथ N'C'(परीक्षण # 1):

SELECT 1 WHERE N'Șc' = N'C' COLLATE Latin1_General_CS_AS;
-- no result (due to "c" and "C" being different case)

SELECT 2 WHERE N'Ș' = N'' COLLATE SQL_Latin1_General_CP1_CI_AS;
SELECT 3 WHERE N'Ș' = N'' COLLATE Latin1_General_CI_AS;

SELECT 4 WHERE N'Ș' = N'' COLLATE Latin1_General_BIN2;
-- no result (due to "Ș" still being a code point and empty string has no code points)

SELECT 5 WHERE N'Ș' = N'' COLLATE Latin1_General_100_CI_AS;
-- no result (due to "Ș" finally having a sort weight in 100 series Collations)

SELECT 6 WHERE N'Ș' = N'' COLLATE Chinese_PRC_CI_AI;
SELECT 7 WHERE N'Ș' = N'' COLLATE Chinese_PRC_90_CI_AI;

SELECT 8 WHERE N'Ș' = N'' COLLATE Indic_General_90_CI_AI;
SELECT 9 WHERE N'Ș' = N'' COLLATE Indic_General_100_CI_AI;
-- no result (due to "Ș" finally having a sort weight in 100 series Collations)

तो, दुर्भाग्य से आपको पीके को गिराने की आवश्यकता होगी, कॉलम को 100-स्तरीय Collation (जैसे Latin1_General_100_CI_AS_SC) में बदलने के लिए , और फिर PK को फिर से बनाना होगा। कृपया ध्यान दें कि कि में अंतर वर्तमान मिलान से मिलान सुझाव दोनों है 100 और_SC अंत है, जो इसे ठीक से अनुपूरक वर्ण को संभालने के लिए अनुमति देता है पर।

इसका मतलब यह नहीं है कि आपको इसकी आवश्यकता है:

  1. अन्य तालिकाओं के Collations को बदलें (जब तक कि उनके NVARCHARPK में समान सेटअप न हो )
  2. डेटाबेस के डिफ़ॉल्ट Collation को बदलें। DB के Collation को नहीं बदलने के साथ मुख्य मुद्दा यह है कि करने के बीच एक व्यवहार अंतर होगा table.column = N'Ș'और @variable = N'Ș'चूंकि चर और स्ट्रिंग शाब्दिक डेटाबेस के डिफ़ॉल्ट Collation का उपयोग करते हैं।

इस व्यवहार के और उदाहरणों के लिए, कृपया निम्नलिखित ब्लॉग पोस्ट के "पूरक चरित्र" अनुभाग देखें:

यूनी-कोड: टी-एसक्यूएल पहचानकर्ताओं के लिए मान्य वर्णों की सही सूची की खोज, 2 का भाग 3 (डिलीवर पहचानकर्ता)

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