N'Latinc ল্যাটিন 1_ জেনারাল_সিআই_এএস কোলেশন ব্যবহার করে 'এন'সি'র সদৃশ কী হিসাবে বিবেচিত


11

আমার কাছে একটি অনন্য কী সহ একটি টেবিল রয়েছে যাতে একটি NVARCHAR(50)কলাম অন্তর্ভুক্ত রয়েছে (সঠিক বা না, তবে রয়েছে)। সুতরাং, সন্নিবেশ করার চেষ্টা করার সময় Șcবা C( সন্নিবেশের ক্রমের কোনও গুরুত্ব নেই) কোলেশন সমস্যার কারণে এটি ২ য় সন্নিবেশকে ভেঙে দেয়। ত্রুটি এখানে:

(1 টি সারি) প্রভাবিত এমএসজি 2601, স্তর 14, রাজ্য 1, লাইন 16 অনন্য সূচক 'IX_TestT' সহ 'dbo.testT' অবজেক্টে নকল কী সন্নিবেশ করা যায় না। সদৃশ কী মানটি হ'ল (সি)।

রিটার্ন নির্বাচন করুন:

এখানে চিত্র বর্ণনা লিখুন

ডাটাবেস ডিফল্ট কোলেশন হয় 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_) এবং উইন্ডোজ কোলিশনের প্রথম দুটি সংস্করণ (যে 80সিরিজটি এসকিউএল সার্ভার 2000 এর সাথে এসেছিল এবং নামটিতে কোনও সংস্করণ নম্বর নেই, এবং যে 90সিরিজটি রয়েছে এসকিউএল সার্ভারের সাথে এসেছিল 2005) একটি দুর্দান্ত অনেক চরিত্রের জন্য বাছাই করা ওজন অনুপস্থিত। এটি বেশিরভাগ 100এসকিউএল সার্ভার ২০০৮-এর সাথে আসা সিরিজ কলেশন দিয়ে শুরু করে সংশোধন করা হয়েছিল ।

আপনি নীচের উদাহরণগুলিতে দেখতে পাচ্ছেন, Șনন-বাইনারি, সংস্করণ 80 বা 90 কোলিশেশন (এবং এসকিউএল সার্ভার কোলিশেশন) ব্যবহার করার সময় অক্ষরটি খালি স্ট্রিংয়ের সাথে মেলে যেহেতু উভয়ের উভয়েরই একই ধরণের ওজন রয়েছে: ০. কিছু নেই। নাদা। এর মানে হল যখন তুলনা 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-স্তরের কোলেশন (উদাঃ Latin1_General_100_CI_AS_SC) করতে কলামটি পরিবর্তন করতে হবে এবং তারপরে পিকে পুনরায় তৈরি করতে হবে। দয়া করে মনে রাখবেন যে পার্থক্য বর্তমান কোলেশন থেকে কোলেশন প্রস্তাব উভয় 100 এবং_SC শেষ, যা এটি সঠিকভাবে সম্পূরক অক্ষর পরিচালনা করতে অনুমতি করেন।

এর অর্থ এই নয় যে আপনার প্রয়োজন:

  1. অন্যান্য টেবিলগুলির কলেশনগুলি পরিবর্তন করুন (যদি না তাদের NVARCHARপিকে একই সেটআপ থাকে )
  2. ডেটাবেসের ডিফল্ট কোলেশন পরিবর্তন করুন। ডিবির কোলেশন পরিবর্তন না করার মূল বিষয়টি হ'ল করণীয় table.column = N'Ș'এবং @variable = N'Ș'ভেরিয়েবল এবং স্ট্রিং ল্যাটারালগুলি ডাটাবেসের ডিফল্ট কল্যানেশন ব্যবহারের মধ্যে আচরণের পার্থক্য থাকতে পারে ।

এই আচরণের আরও উদাহরণের জন্য, দয়া করে আমার নিম্নলিখিত ব্লগ পোস্টের "পরিপূরক চরিত্রগুলি" বিভাগটি দেখুন:

ইউনি-কোড: টি-এসকিউএল সনাক্তকারীদের জন্য বৈধ অক্ষরের সঠিক তালিকার সন্ধান, 2 এর অংশ 3 (বিস্মৃত পরিচয়দাতা)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.