কেস-সংবেদনশীল কোলেশন কীভাবে কাজ করে?


19

এসকিউএল সার্ভারে ডিফল্ট কোলিশন ধরণের সংবেদনশীল স্ট্রিংয়ের বিরুদ্ধে সূচীকরণের অনুমতি দেয় তবুও তথ্যের ক্ষেত্রে স্থির থাকে। এটি আসলে কীভাবে কাজ করে? আমি আসল বাদাম এবং বল্টস, বিটস এবং বাইটস বা একটি ভাল সংস্থান খুঁজছি যা এটিকে বিশদভাবে ব্যাখ্যা করে।

create table casetest (fruitnames nvarchar(50) not null);
create unique index IX_fruitnames on casetest(fruitnames);

insert into casetest values ('apples');
insert into casetest values ('Pears');
-- this insert fails
insert into casetest values ('pears');

-- this yields 'Pears' as a result
select * from casetest (forceseek) where fruitnames = 'PEARS'

update casetest set fruitnames = 'pears' where fruitnames = 'pEArs'

-- this yields 'pears' as a result
select * from casetest (forceseek) where fruitnames = 'PEARS'

এসকিউএল সার্ভার কলেশন সম্পর্কিত প্রশ্ন আপনি রবার্ট শেল্ডন জিজ্ঞাসা করতে খুব লজ্জা পেয়েছিলেন কীভাবে কোলেশন ব্যবহার করবেন তা কভার করে। এটি কীভাবে কোলেশন কাজ করে তা কভার করে না। আমি একই সাথে কেস ডেটা সংরক্ষণ করার সময় কীভাবে একটি সূচককে দক্ষতার সাথে তৈরি করা / অনুসন্ধান করা যায় সে সম্পর্কে আগ্রহী।


1
কেস-সংবেদনশীল ক্ষেত্রের বিরুদ্ধে কেস-সংবেদনশীল স্ট্রিংগুলি আপনি দক্ষতার সাথে জিজ্ঞাসা করতে পারেন (তবে এটি কিছুটা বিরক্তিকর)
জন আইজব্রেনার

কোকোগোরিলা: দয়া করে নোট # 1 দেখুন যা আমি সবেমাত্র আমার উত্তরের শেষে যুক্ত করেছি রে: "ডিফল্ট" কোলেশন।
সলোমন রুটজকি

উত্তর:


26

সংবেদনশীল স্ট্রিংয়ের বিরুদ্ধে সূচী করা তথ্যের ক্ষেত্রে এখনও অবিরত রয়েছে। এটি আসলে কীভাবে কাজ করে?

এটি আসলে কোনও এসকিউএল সার্ভারের নির্দিষ্ট আচরণ নয়, সাধারণভাবে এই জিনিসগুলি কীভাবে কাজ করে তা ঠিক।

সুতরাং, তথ্য ডেটা হয়। আপনি একটি সূচক সম্পর্কে বিশেষভাবে বলতে হয় তাহলে, ডাটা দরকার সংরক্ষণ করা হিসেবে এটা অন্য এটা প্রতিটি সময় একটি চেহারা-আপ প্রধান টেবিল প্রয়োজন প্রকৃত মূল্য পেতে হবে, এবং সেখানে একটি আচ্ছাদন সূচক কোন সম্ভাবনা হবে (এ অন্তত স্ট্রিং ধরণের জন্য নয়)।

তথ্য, হয় টেবিল / ক্লাস্টার সূচক বা অ- ক্লাস্টার সূচক, নেই না কোন কোলেশন / বাছাই তথ্য ধারণ করে। এটি কেবল ডেটা। কোলেশন (স্থানীয় / সংস্কৃতির নিয়ম এবং সংবেদনশীলতা) কলামের সাথে সংযুক্ত কেবল একটি মেটা ডেটা এবং যখন একটি বাছাই করা ক্রিয়াকলাপ বলা হয় তখন ব্যবহৃত হয় (যদি না যে কোনও দ্বারা ওভাররাইড করা হয়)COLLATEঅনুচ্ছেদ), যার মধ্যে একটি সূচক তৈরি / পুনর্নির্মাণ অন্তর্ভুক্ত থাকবে। নন-বাইনারি কোলেশন দ্বারা সংজ্ঞায়িত নিয়মগুলি বাছাই-কী উত্পন্ন করতে ব্যবহৃত হয়, যা স্ট্রিংয়ের বাইনারি উপস্থাপনা (সাইন্ট কীগুলি বাইনারি কোলেশনগুলিতে অপ্রয়োজনীয়)। এই বাইনারি উপস্থাপনাগুলিতে সমস্ত লোকাল / সংস্কৃতি বিধি এবং নির্বাচিত সংবেদনশীলতাগুলিকে অন্তর্ভুক্ত করে। বাছাই-কীগুলি তাদের যথাযথ ক্রমে রেকর্ডগুলি রাখার জন্য ব্যবহৃত হয়, তবে তারা নিজেরাই সূচি বা সারণীতে সংরক্ষণ করা হয় না। সেগুলি সংরক্ষণ করা হয়নি (কমপক্ষে আমি সূচকগুলিতে এই মানগুলি দেখিনি এবং তাদের জানানো হয়েছিল যে সেগুলি সংরক্ষণ করা হয়নি) কারণ:

  1. বাছাইয়ের জন্য তাদের সত্যিকারের প্রয়োজন নেই যেহেতু তারা কেবল সারণিতে বা সূচির সারিগুলির মতো একই ক্রমে থাকবে। তবে, সূচকের শারীরিক ক্রমটি কেবল বাছাই করছে, তুলনা নয়।
  2. এগুলি সংরক্ষণ করার সাথে তুলনা আরও দ্রুত করা হতে পারে , তবে এটি সূচকে আরও বড় করে তুলবে কারণ একটি একক অক্ষরের ন্যূনতম আকার 5 বাইট এবং এটি কেবল "ওভারহেড" (সাজানোর কী কাঠামোর)। বেশিরভাগ অক্ষর প্রতিটি 2 বাইট হয়, একটি উচ্চারণ থাকলে 1 বাইট, এবং উচ্চতর ক্ষেত্রে 1 বাইট হয়। উদাহরণস্বরূপ, "ই" একটি 7-বাইট কী, "ই" এবং "é" উভয়ই 8 বাইট এবং "É" একটি 9-বাইট কী। অতএব, শেষ পর্যন্ত এগুলি সংরক্ষণ করার মতো নয়।

দুটি ধরণের কোলিশন রয়েছে: এসকিউএল সার্ভার এবং উইন্ডোজ।

SQL সার্ভার

এসকিউএল সার্ভারের সমাহারগুলি (যাদের নাম দিয়ে শুরু করা হয় SQL_) SQL_Latin1_General_CP1_CI_ASহ'ল পুরানো, প্রাক-এসকিউএল সার্ভার 2000 বাছাই / তুলনা করার পদ্ধতি (যদিও ইউএস ইংলিশ ওএসে ইনস্টলেশন ডিফল্ট এখনও বেশ দুঃখের সাথে)। এই পুরানো, সরল, নন-ইউনিকোড মডেল, লোকেল, কোড পৃষ্ঠা এবং বিভিন্ন সংবেদনশীলতার প্রতিটি সংমিশ্রণকে সেই কোড পৃষ্ঠাতে প্রতিটি অক্ষরের একটি স্ট্যাটিক ম্যাপিং দেওয়া হয়। প্রতিটি অক্ষরকে অন্যের সাথে কীভাবে সমান করা হয় তা বোঝাতে একটি মান (অর্থাত্ সাজানো ওজন) নির্ধারিত হয়। এই মডেলের তুলনাগুলি একটি দ্বি-পাস অপারেশন করতে দেখা যায়:

  1. প্রথমত, এটা সব কথা সরিয়ে ফেলা হবে (যেমন যে "  ü  " পরিণত হন "  U  "), "মত অক্ষর বিস্তৃতি  AE  " মধ্যে "  একটি  " এবং "   ", যাতে শব্দ (ক প্রাকৃতিক আদেশ হয় তুমি কেমন would তারপর ইনিশিয়াল সাজানোর করে এগুলি একটি অভিধানে সন্ধান করার প্রত্যাশা করুন)।
  2. তারপরে, প্রতিটি চরিত্রের জন্য অন্তর্নিহিত মানগুলির উপর ভিত্তি করে সাম্যতা নির্ধারণ করতে এটি চরিত্র অনুসারে অক্ষরে যায় । এই দ্বিতীয় অংশটি হ'ল মোস্তাকসিও তাঁর উত্তরে বর্ণনা করছেন ।

এই সংযোগগুলিতে একমাত্র সংবেদনশীলতাগুলি সমন্বয় করা যেতে পারে: "কেস" এবং "অ্যাকসেন্ট" ("প্রস্থ", "কানা টাইপ" এবং "বৈকল্পিক নির্বাচনকারী" উপলভ্য নয়)। এছাড়াও, এই কোলেশনগুলির কোনওটিই পরিপূরক চরিত্রগুলিকে সমর্থন করে না (যা সেগুলি ইউনিকোড-নির্দিষ্ট হিসাবে বোঝায় এবং এই কোলিশনগুলি কেবল নন-ইউনিকোড ডেটার ক্ষেত্রে প্রযোজ্য)।

এই পদ্ধতিটি কেবল অ-ইউনিকোড VARCHARডেটার ক্ষেত্রে প্রযোজ্য । লোকেল, কোড পৃষ্ঠা, কেস-সংবেদনশীলতা এবং অ্যাকসেন্ট-সংবেদনশীলতার প্রতিটি অনন্য সংমিশ্রণের একটি নির্দিষ্ট "সাজানো আইডি" রয়েছে, যা আপনি নিম্নলিখিত উদাহরণে দেখতে পারেন:

SELECT COLLATIONPROPERTY(N'SQL_Latin1_General_CP1_CI_AS', 'SortID'), -- 52
       COLLATIONPROPERTY(N'SQL_Latin1_General_CP1_CS_AS', 'SortID'), -- 51
       COLLATIONPROPERTY(N'Latin1_General_100_CI_AS',     'SortID'); --  0

প্রথম দুটি কোলেশনগুলির মধ্যে কেবলমাত্র পার্থক্য হ'ল কেস-সংবেদনশীলতা। তৃতীয় কলেজটি একটি উইন্ডোজ কোলেশন এবং তাই কোনও স্ট্যাটিক ম্যাপিং টেবিল নেই।

এছাড়াও, এই কোলিশগুলি ওজন বাছাই করার জন্য চরিত্রটির জন্য সাধারণ অনুসন্ধানের কারণে উইন্ডোজ কোলেশনগুলির তুলনায় দ্রুত বাছাই এবং তুলনা করা উচিত। যাইহোক, এই জোটগুলিও খুব কম কার্যকরী এবং যদি সম্ভব হয় তবে সাধারণত এড়ানো উচিত।

উইন্ডোজ

উইন্ডোজ কোলিশনগুলি (যাদের নাম দিয়ে শুরু হয় নাSQL_ ) বাছাই / তুলনা করার পদ্ধতিটি নতুন (এসকিউএল সার্ভার 2000-এ শুরু হয় ) are এই নতুন, জটিল, ইউনিকোড মডেলটিতে প্রতিটি লোকেল, কোড পৃষ্ঠা এবং বিভিন্ন সংবেদনশীলতার সমন্বয়কে একটি স্ট্যাটিক ম্যাপিং দেওয়া হয় না । একটি জিনিসের জন্য, এই মডেলটিতে কোনও কোড পৃষ্ঠা নেই। এই মডেলটি প্রতিটি চরিত্রের জন্য একটি ডিফল্ট বাছাইয়ের মান নির্ধারণ করে এবং তারপরে প্রতিটি স্থানীয় / সংস্কৃতি যে কোনও সংখ্যক অক্ষরকে সাজানোর মানগুলি পুনরায় বরাদ্দ করতে পারে। এটি একাধিক সংস্কৃতিকে বিভিন্ন উপায়ে একই বর্ণগুলি ব্যবহার করতে দেয়। এটি একই অক্ষর ব্যবহার না করে যদি একাধিক ভাষাগুলি প্রাকৃতিকভাবে একই কোলেশন ব্যবহার করে বাছাই করার অনুমতি দেয় (এবং যদি তাদের মধ্যে কোনওটির জন্য কোনও মান পুনরায় বরাদ্দ করার প্রয়োজন না হয় এবং কেবলমাত্র ডিফল্টগুলি ব্যবহার করতে পারে) এর প্রভাব পড়ে।

এই মডেলটিতে বাছাই করা মানগুলি একক মান নয়। এগুলি মানগুলির একটি বিন্যাস যা বেজ লেটার, যে কোনও ডায়াক্রিটিক্স (অর্থাত্ উচ্চারণ), কেসিং ইত্যাদির তুলনামূলক ওজন নির্ধারণ করে If যদি কোলেশন কেস-সংবেদনশীল হয়, তবে সেই অ্যারের "কেস" অংশটি ব্যবহৃত হয়, অন্যথায় এটি উপেক্ষা করা হয় ( অতএব, সংবেদনশীল)। যদি কোলেশন অ্যাকসেন্ট-সংবেদনশীল হয়, তবে অ্যারের "ডায়াক্রিটিক" অংশটি ব্যবহৃত হয়, অন্যথায় এটি উপেক্ষা করা হয় (অতএব, সংবেদনশীল)।

এই মডেলের তুলনাগুলি একটি বহু-পাস অপারেশন:

  1. প্রথমত, স্ট্রিংটি স্বাভাবিক করা হয় যাতে একই চরিত্রটির প্রতিনিধিত্ব করার বিভিন্ন উপায় সমান হয়। উদাহরণস্বরূপ, " ü " একটি একক অক্ষর / কোড পয়েন্ট (U + 00FC) হতে পারে। আপনি একটি কম্বাইনিং ডায়ারেসিস " ̈ " (U + 0308) এর সাথে একটি অ-উচ্চারণযুক্ত " u " (U + 0075) একত্রিত করতে পারেন: " ü ", যা রেন্ডার করার সময় কেবল একই রকম হয় না (যদি সমস্যা না থাকে তবে) আপনার হরফ), তবে এটি বাইনারি কোলেশন (যা অক্ষরের পরিবর্তে বাইটগুলির সাথে তুলনা করে) ব্যবহার না করে একক অক্ষর সংস্করণ (U + 00FC) হিসাবে সমান বলে বিবেচিত হয়। সাধারণকরণ একক অক্ষরকে বিভিন্ন টুকরো টুকরো টুকরো করে, যার মধ্যে " Æ  " (এসকিউএল সার্ভারের জোটের জন্য উপরে উল্লিখিত হিসাবে) অক্ষরের বিস্তৃতি রয়েছে  ।
  2. এই মডেলটির তুলনা অপারেশন প্রতিটি সংবেদনশীলতা অনুসারে চরিত্র অনুসারে চলে । স্ট্রিংগুলির জন্য বাছাই চাবিগুলি সংবেদনশীলতাগুলি "সংবেদনশীল" যার ভিত্তিতে মানগুলির প্রতিটি অক্ষর কোলেশন অ্যারের উপযুক্ত উপাদান প্রয়োগ করে নির্ধারিত হয়। বাছাই মূল্যের মানগুলি প্রতিটি চরিত্রের প্রাথমিক সংবেদনশীলতাগুলি (ভিত্তি চরিত্র) দ্বারা সজ্জিত করা হয়, তারপরে গৌণ সংবেদনশীলতাগুলি (ডায়াক্রিটিক ওজন) এর পরে এবং প্রতিটি চরিত্রের কেস ওজন অনুসরণ করে।
  3. বাছাই করা গণনা করা বাছাই করা কীগুলির উপর ভিত্তি করে সঞ্চালিত হয়। প্রতিটি সংবেদনশীলতার সাথে একত্রে দলবদ্ধ হয়ে, একাধিক অক্ষরের স্ট্রিং তুলনা করার সময় আপনি সমতুল্য এসকিউএল সার্ভারের জোটের চেয়ে আলাদা সাজানোর অর্ডার পেতে পারেন এবং উচ্চারণগুলি এতে জড়িত রয়েছে, এবং জোটটি অ্যাকসেন্ট-সংবেদনশীল (এবং আরও বেশি যদি কোলেশন হয় তবে কেস সংবেদনশীল)।

এই বাছাই সম্পর্কিত আরও তথ্যের জন্য, আমি শেষ পর্যন্ত একটি পোস্ট প্রকাশ করব যা সকার্ট কী মানগুলি কীভাবে গণনা করা হয়, এসকিউএল সার্ভার এবং উইন্ডোজ কোলিশনের মধ্যে পার্থক্য ইত্যাদি দেখায় But তবে এখনই দয়া করে আমার উত্তরটি দেখুন: অ্যাকসেন্ট সংবেদনশীল সাজান ( দয়া করে মনে রাখবেন যে এই প্রশ্নের অন্য উত্তরটি অফিশিয়াল ইউনিকোড অ্যালগরিদমের একটি ভাল ব্যাখ্যা, তবে এসকিউএল সার্ভার পরিবর্তে একটি কাস্টম ব্যবহার করে, যদিও অনুরূপ, অ্যালগরিদম এবং এমনকি একটি কাস্টম ওজন সারণী)।

সমস্ত সংবেদনশীলতাগুলি এই কোলেশনগুলিতে সামঞ্জস্য করা যেতে পারে: "কেস", "অ্যাকসেন্ট", "প্রস্থ", "কানা টাইপ", এবং "প্রকরণ নির্বাচনকারী" (এসকিউএল সার্ভার 2017-এ শুরু হয় এবং কেবলমাত্র জাপানি কোলিশের জন্য)। এছাড়াও, এই কয়েকটি কোলিশন (যখন ইউনিকোড ডেটা ব্যবহার করা হয়) পরিপূরক অক্ষরকে সমর্থন করে (এসকিউএল সার্ভার ২০১২ থেকে শুরু করে)। এই পদ্ধতির উভয় NVARCHAR এবং VARCHAR ডেটা (এমনকি অ-ইউনিকোড ডেটা) প্রযোজ্য । এটি VARCHARপ্রথমে মানটিকে ইউনিকোডে রূপান্তর করে এবং তার পরে বাছাই / তুলনা বিধি প্রয়োগ করে অ-ইউনিকোড ডেটা প্রয়োগ করে।


দয়া করে নোট করুন:

  1. এসকিউএল সার্ভারের জন্য কোনও সার্বজনীন ডিফল্ট কোলেশন নেই। একটি ইনস্টলেশন ডিফল্ট রয়েছে যা ইনস্টলেশনের সময় ওএসের বর্তমান স্থানীয় / ভাষা সেটিংয়ের উপর ভিত্তি করে পৃথক হয় (যা দুর্ভাগ্যক্রমে SQL_Latin1_General_CP1_CI_ASমার্কিন ইংরেজী সিস্টেমগুলির জন্য, সুতরাং দয়া করে এই পরামর্শটির জন্য ভোট দিন )। এটি ইনস্টলেশনের সময় পরিবর্তন করা যেতে পারে। এই উদাহরণস্বরূপ স্তরের [model]কলেজটি নতুন ডিবি তৈরির সময় ব্যবহৃত টেম্পলেটটি ডিবি-র জন্য কোলেশন সেট করে , তবে ক্লজটি CREATE DATABASEনির্দিষ্ট করে সম্পাদন করার সময় কোলেশন পরিবর্তন করা যেতে পারে COLLATE। এই ডাটাবেস-স্তরের কোলেশনটি ভেরিয়েবল এবং স্ট্রিং লিটারেলের জন্য ব্যবহৃত হয়, পাশাপাশি নতুন (এবং পরিবর্তিত!) কলামগুলির ক্ষেত্রে ডিফল্টটি যখন COLLATEক্লজটি নির্দিষ্ট না করা হয় (যা প্রশ্নের উদাহরণের কোডের ক্ষেত্রে)।
  2. কোলেশন / এনকোডিংস / ইউনিকোড সম্পর্কিত আরও তথ্যের জন্য, দয়া করে এখানে যান: কোলেশন তথ্য

5

সাধারণত এটি কোলেশন টেবিলগুলি ব্যবহার করে প্রয়োগ করা হয় যা প্রতিটি চরিত্রের জন্য একটি নির্দিষ্ট স্কোর নির্ধারণ করে। বাছাইকরণের রুটিনে একটি তুলনাকারী থাকে যা ডিফল্ট বা স্পষ্টভাবে নির্দিষ্টভাবে নির্দিষ্ট স্টেবিল ব্যবহার করে স্ট্রিংগুলি, অক্ষর দ্বারা অক্ষরকে তুলনা করতে, তাদের কোলেশন স্কোরগুলি ব্যবহার করে একটি উপযুক্ত টেবিল ব্যবহার করে। যদি উদাহরণস্বরূপ, একটি নির্দিষ্ট কোলেশন টেবিলটি 1 থেকে "ক" এবং "201" থেকে "এ" এর স্কোর বরাদ্দ করে, এবং এই নির্দিষ্ট প্রয়োগের একটি কম স্কোর মানে উচ্চতর অগ্রাধিকার, তবে "এ" এর আগে "ক" আরও বাছাই হবে। অন্য একটি সারণী বিপরীত স্কোরগুলি বরাদ্দ করতে পারে: 201 থেকে "a" এবং 1 থেকে "A", এবং সাজানোর ক্রমটি পরে বিপরীত হবে। তবুও অন্য একটি সারণী "a", "A", "Á" এবং "Å" এর সমান স্কোর বরাদ্দ করতে পারে, যা কেস- এবং অ্যাকসেন্ট-সংবেদনশীল তুলনা এবং বাছাইয়ের দিকে নিয়ে যায়।

একইভাবে, প্রেডিকেটে সরবরাহকৃত মানের সাথে সূচক কীটির তুলনা করার সময় এই জাতীয় কোলেশন টেবিল ভিত্তিক তুলনামূলক ব্যবহৃত হয়।


1
শুধু এফওয়াইআই: ডেটা SQL_ব্যবহার করার সময় এই VARCHARতথ্যটি এসকিউএল সার্ভারের কোলিশেশনগুলির (যেমন নামগুলির সাথে শুরু হওয়া ) ব্যবহারের ক্ষেত্রে কেবলমাত্র সঠিক । উইন্ডোজ কোলেশন (নামগুলি শুরু হয় না ) ব্যবহার করার সময় এটি NVARCHARডেটা বা VARCHARডেটার জন্য ঠিক সত্য নয়SQL_
সলোমন রুটজকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.