অ্যাকসেন্ট সংবেদনশীল বাছাই করুন


19

এই দুটি SELECTবিবৃতি কেন একটি পৃথক বাছাই ক্রমে ফলাফল?

USE tempdb;
CREATE TABLE dbo.OddSort 
(
    id INT IDENTITY(1,1) PRIMARY KEY
    , col1 NVARCHAR(2)
    , col2 NVARCHAR(2)
);
GO
INSERT dbo.OddSort (col1, col2) 
VALUES (N'e', N'eA')
    , (N'é', N'éB')
    , (N'ë', N'ëC')
    , (N'è', N'èD')
    , (N'ê', N'êE')
    , (N'ē', N'ēF');
GO

SELECT * 
FROM dbo.OddSort 
ORDER BY col1 COLLATE Latin1_General_100_CS_AS;
╔════╦══════╦══════╗
║ আইডি ║ কল 1 ║ কল 2 ║ ║
╠════╬══════╬══════╣
║ 1 ║ ই ║ ইএ ║
║ 2 ║ é ║ éB ║
║ 4 ║ è ║ èD ║ - আইডি 3 হওয়া উচিত?
║ 5 ║ ê ║ êE ║
║ 3 ║ ë ║ ëC ║
║ 6 ║ ē ║ ēF
╚════╩══════╩══════╝
SELECT * 
FROM dbo.OddSort 
ORDER BY col2 COLLATE Latin1_General_100_CS_AS;
╔════╦══════╦══════╗
║ আইডি ║ কল 1 ║ কল 2 ║ ║
╠════╬══════╬══════╣
║ 1 ║ ই ║ ইএ ║
║ 2 ║ é ║ éB ║
║ 3 ║ ë ║ ëC ║
║ 4 ║ è ║ èD ║
║ 5 ║ ê ║ êE ║
║ 6 ║ ē ║ ēF
╚════╩══════╩══════╝

উত্তর:


13

এই প্রশ্নটি ডেটাবেসের সাথে এতটা সম্পর্কিত নয় তবে ইউনিকোড হ্যান্ডলিং এবং নিয়মের উপর বেশি।

Https://docs.microsoft.com/en-us/sql/t-sql/statements/windows-collation-name-transact-sql লাতিন 1_ জেনারেল_100_CS_AS এর উপর ভিত্তি করে : "কোডেশন লাতিন 1 সাধারণ অভিধান বাছাইয়ের নিয়ম এবং কোড পৃষ্ঠাতে মানচিত্র ব্যবহার করে 1252 "যুক্ত সিএস = কেস সংবেদনশীল এবং এএস = অ্যাকসেন্ট সংবেদনশীল সহ।

উইন্ডোজ কোড পৃষ্ঠা 1252 এবং ইউনিকোডের মধ্যে ম্যাপিং ( http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT ) আমরা যে সমস্ত অক্ষর নিয়ে কাজ করছি তার জন্য একই মান দেখায় (ম্যাক্রোন সহ ই বাদ দিয়ে) এটি মাইক্রোসফ্ট ম্যাপিংয়ে বিদ্যমান নেই, সুতরাং এটি এই ক্ষেত্রে কী করে তা কোনও ধারণা নেই), তাই আমরা আপাতত ইউনিকোড সরঞ্জাম এবং পরিভাষায় মনোনিবেশ করতে পারি।

প্রথমে আপনার সমস্ত স্ট্রিংয়ের জন্য আমরা কীভাবে আচরণ করছি তা অবগতভাবে আমাদের জানতে দিন:

0065  LATIN SMALL LETTER E
0041  LATIN CAPITAL LETTER A
00E9  LATIN SMALL LETTER E WITH ACUTE
0042  LATIN CAPITAL LETTER B
00EB  LATIN SMALL LETTER E WITH DIAERESIS
0043  LATIN CAPITAL LETTER C
00E8  LATIN SMALL LETTER E WITH GRAVE
0044  LATIN CAPITAL LETTER D
00EA  LATIN SMALL LETTER E WITH CIRCUMFLEX
0045  LATIN CAPITAL LETTER E
0113  LATIN SMALL LETTER E WITH MACRON
0046  LATIN CAPITAL LETTER F

ইউনিকোড কলেশন অ্যালগরিদম এখানে বর্ণিত হয়েছে: https://www.unicode.org/report/tr10/

বিভাগের ১.৩ দেখুন "প্রাসঙ্গিক সংবেদনশীলতা" যা ব্যাখ্যা করে যে বাছাই করা অন্যের পরে কেবল একটি চরিত্রের উপর নির্ভর করতে পারে না কারণ কিছু নিয়ম প্রসঙ্গে সংবেদনশীল।

এই পয়েন্টগুলি 1.8 তে নোট করুন:

কোলেশন স্ট্রিংয়ের সম্পত্তি নয়। কোলেশন অর্ডার সাধারণভাবে সংক্ষিপ্তকরণ বা সাবস্ট্রিং অপারেশনের অধীনে সংরক্ষণ করা হয় না।

ডিফল্টরূপে, অ্যালগরিদম তিনটি সম্পূর্ণ কাস্টমাইজযোগ্য স্তর ব্যবহার করে। ল্যাটিন লিপির জন্য, এই স্তরগুলি মোটামুটিভাবে এর সাথে মিলিত হয়:

alphabetic ordering
diacritic ordering
case ordering.

তবে নিজে থেকেই অ্যালগরিদমটি কিছুটা ঘন। এর সূত্রটি হ'ল: সংক্ষেপে বলা হয়েছে, ইউনিকোড কোলিশন অ্যালগরিদম একটি ইনপুট ইউনিকোড স্ট্রিং এবং একটি কোলেশন এলিমেন্ট টেবিল নিয়ে থাকে, যেখানে অক্ষরের জন্য ম্যাপিং ডেটা থাকে। এটি একটি বাছাই কী উত্পন্ন করে, যা স্বাক্ষরযুক্ত 16-বিট পূর্ণসংখ্যার অ্যারে ray দু'বার বা তার বেশি উত্পন্ন উত্পাদিত কীগুলি তারপরে তৈরি হওয়া স্ট্রিংগুলির মধ্যে সঠিক তুলনা করার জন্য বাইনারি-তুলনা করা যেতে পারে।

আপনি এখানে নির্দিষ্ট ল্যাটিন বাছাইয়ের নিয়মগুলি দেখতে পারেন: http://developer.mimer.com/colifications/charts/latin.htm বা আরও সরাসরি এবং বিশেষত এমএস এসকিউএল: http://collation-charts.org/mssql/mssql এর জন্য। 0409.1252.Latin1_General_CS_AS.html

জন্য eচরিত্র এটা দেখায়:

ই ই é É è È ê Ê ë Ë Ë

col1কোড পৃষ্ঠা 1252 এ ē বিদ্যমান নেই ব্যতীত অর্ডার করার সময় এটি আপনার ফলাফলগুলি ব্যাখ্যা করে, সুতরাং এটির সাথে এটি কী করে আমার একেবারে কোনও ধারণা নেই।

বা যদি আমরা হাতে হাতে ইউনিকোড অ্যালগরিদম করি, তবে http://www.unicode.org/Public/UCA/latest/allkeys.txt এ DUCET- র কীগুলি ব্যবহার করে :

পদক্ষেপ 1: সাধারণীকরণ ফর্ম ডি, তাই প্রতিটি ক্ষেত্রে হয়ে যায়:

e => U+0065
é => U+0065 U+0301
ë => U+0065 U+0308
è => U+0065 U+0300
ê => U+0065 U+0302
ē => U+0065 U+0304

পদক্ষেপ 2, কোলেশন অ্যারে উত্পাদন করুন (ফাইলটিতে দেখুন allkeys.txt)

e => [.1D10.0020.0002]
é => [.1D10.0020.0002] [.0000.0024.0002]
ë => [.1D10.0020.0002] [.0000.002B.0002]
è => [.1D10.0020.0002] [.0000.0025.0002]
ê => [.1D10.0020.0002] [.0000.0027.0002]
ē => [.1D10.0020.0002] [.0000.0032.0002]

পদক্ষেপ 3, ফর্ম বাছাই কী (প্রতিটি স্তরের জন্য, প্রতিটি কোলেশন অ্যারের ভিতরে প্রতিটি মান নিয়ে যান, তারপরে 0000 ডিলিমিটেটর হিসাবে রাখুন এবং পরবর্তী স্তরের জন্য আবার শুরু করুন)

e => 1D10 0000 0020 0000 0002
é => 1D10 0000 0020 0024 0000 0002 0002
ë => 1D10 0000 0020 002B 0000 0002 0002
è => 1D10 0000 0020 0025 0000 0002 0002
ê => 1D10 0000 0020 0027 0000 0002 0002
ē => 1D10 0000 0020 0032 0000 0002 0002

পদক্ষেপ 4, বাছাই কীগুলির সাথে তুলনা করুন (প্রতিটি মানের একের পর এক সাধারণ বাইনারি তুলনা): চতুর্থ মানগুলি সমস্তকে বাছাই করার জন্য যথেষ্ট, সুতরাং চূড়ান্ত ক্রমটি হয়ে যায়:

e
é
è
ê
ë
ē

অর্ডার দেওয়ার জন্য একই পদ্ধতিতে col2:

পদক্ষেপ 1: এনএফডি

eA => U+0065 U+0041
éB => U+0065 U+0301 U+0042
ëC => U+0065 U+0308 U+0043
èD => U+0065 U+0300 U+0044
êE => U+0065 U+0302 U+0045
ēF => U+0065 U+0304 U+0046

পদক্ষেপ 2: কোলেশন অ্যারে

eA => [.1D10.0020.0002] [.1CAD.0020.0008]
éB => [.1D10.0020.0002] [.0000.0024.0002] [.1CC6.0020.0008]
ëC => [.1D10.0020.0002] [.0000.002B.0002] [.1CE0.0020.0008]
èD => [.1D10.0020.0002] [.0000.0025.0002] [.1CF5.0020.0008]
êE => [.1D10.0020.0002] [.0000.0027.0002] [.1D10.0020.0008]
ēF => [.1D10.0020.0002] [.0000.0032.0002] [.1D4B.0020.0008]

পদক্ষেপ 3: ফর্ম বাছাই কী

eA => 1D10 1CAD 0000 0020 0020 0000 0002 0008
éB => 1D10 1CC6 0000 0020 0024 0020 0000 0002 0002 0008
ëC => 1D10 1CE0 0000 0020 002B 0020 0000 0002 0002 0008
èD => 1D10 1CF5 0000 0020 0025 0020 0000 0002 0002 0008
êE => 1D10 1D10 0000 0020 0027 0020 0000 0002 0002 0008
ēF => 1D10 1D4B 0000 0020 0032 0020 0000 0002 0002 0008

পদক্ষেপ 4: বাছাই কীগুলির সাথে তুলনা করুন: দ্বিতীয় মানটি তাদের সকলকে বাছাই করার জন্য যথেষ্ট এবং এটি ইতিমধ্যে ক্রমবর্ধমান ক্রম হিসাবে রয়েছে, সুতরাং চূড়ান্ত ক্রমটি আসলে:

eA
éB
ëC
èD
êE
ēF

আপডেট : সলোমন রুটজকির তৃতীয় কেস যুক্ত করা, যা নতুন নিয়মকে সক্ষম করে এমন জায়গার কারণে জটিলতর (আমি "অজানা মামলা" নির্বাচন করেছি):

পদক্ষেপ 1, এনএফডি:

è 1 => U+0065 U+0300 U+0020 U+0031
ê 5 => U+0065 U+0302 U+0020 U+0035
e 2 => U+0065 U+0020 U+0032
é 4 => U+0065 U+0301 U+0020 U+0034
ē 3 => U+0065 U+0304 U+0020 U+0033
ë 6 => U+0065 U+0308 U+0020 U+0036

পদক্ষেপ 2, কোলেশন অ্যারে উত্পাদন করুন:

è 1 => [.1D10.0020.0002] [.0000.0025.0002] [*0209.0020.0002] [.1CA4.0020.0002]
ê 5 => [.1D10.0020.0002] [.0000.0027.0002] [*0209.0020.0002] [.1CA8.0020.0002]
e 2 => [.1D10.0020.0002] [*0209.0020.0002] [.1CA5.0020.0002]
é 4 => [.1D10.0020.0002] [.0000.0024.0002] [*0209.0020.0002] [.1CA7.0020.0002]
ē 3 => [.1D10.0020.0002] [.0000.0032.0002] [*0209.0020.0002] [.1CA6.0020.0002]
ë 6 => [.1D10.0020.0002] [.0000.002B.0002] [*0209.0020.0002] [.1CA9.0020.0002]

পদক্ষেপ 3, ফর্ম বাছাই কী:

è 1 => 1D10 0209 1CA4 0000 0020 0025 0020 0020 0000 0002 0002 0002 0002
ê 5 => 1D10 0209 1CA8 0000 0020 0027 0020 0020 0000 0002 0002 0002 0002
e 2 => 1D10 0209 1CA5 0000 0020 0020 0020 0000 0002 0002 0002
é 4 => 1D10 0209 1CA7 0000 0020 0024 0020 0020 0000 0002 0002 0002 0002
ē 3 => 1D10 0209 1CA6 0000 0020 0032 0020 0020 0000 0002 0002 0002 0002
ë 6 => 1D10 0209 1CA9 0000 0020 002B 0020 0020 0000 0002 0002 0002 0002

পদক্ষেপ 4, বাছাই কীগুলির সাথে তুলনা করুন:

মূলত তৃতীয় মানটি অর্ডার নির্ধারণ করে, এবং এটি বাস্তবে কেবলমাত্র শেষ অঙ্কের উপর নির্ভর করে তাই আদেশটি হওয়া উচিত:

è 1
e 2
ē 3
é 4
ê 5
ë 6

ইউনিকোড সংস্করণ সম্পর্কে সলোমন রুটজির মন্তব্যের ভিত্তিতে দ্বিতীয় আপডেট

আমি allkeys.txtএই সময়ে সর্বশেষতম ইউনিকোড সংস্করণ সম্পর্কিত ডেটা ব্যবহার করেছি , এটি সংস্করণ 10.0

যদি আমাদের পরিবর্তে ইউনিকোড 5.1 গ্রহণ করা প্রয়োজন , এটি হ'ল : http://www.unicode.org/Public/UCA/5.1.0/allkeys.txt

আমি কেবল যাচাই করেছি, উপরের সমস্ত অক্ষরের জন্য, পরিবর্তনের অ্যারেগুলি পরিবর্তে নিম্নলিখিতটি রয়েছে:

e => [.119D.0020.0002.0065]
é => [.119D.0020.0002.0065] [.0000.0032.0002.0301]
ë => [.119D.0020.0002.0065] [.0000.0047.0002.0308]
è => [.119D.0020.0002.0065] [.0000.0035.0002.0300]
ê => [.119D.0020.0002.0065] [.0000.003C.0002.0302]
ē => [.119D.0020.0002.0065] [.0000.005B.0002.0304]

এবং:

eA => [.119D.0020.0002.0065] [.1141.0020.0008.0041]
éB => [.119D.0020.0002.0065] [.0000.0032.0002.0301] [.1157.0020.0008.0042]
ëC => [.119D.0020.0002.0065] [.0000.0047.0002.0308] [.116F.0020.0008.0043]
èD => [.119D.0020.0002.0065] [.0000.0035.0002.0300] [.1182.0020.0008.0044]
êE => [.119D.0020.0002.0065] [.0000.003C.0002.0302] [.119D.0020.0008.0045]
ēF => [.119D.0020.0002.0065] [.0000.005B.0002.0304] [.11D5.0020.0008.0046]

এবং:

è 1 => [.119D.0020.0002.0065] [.0000.0035.0002.0300] [*0209.0020.0002.0020] [.1138.0020.0002.0031]
ê 5 => [.119D.0020.0002.0065] [.0000.003C.0002.0302] [*0209.0020.0002.0020] [.113C.0020.0002.0035]
e 2 => [.119D.0020.0002.0065] [*0209.0020.0002.0020] [.1139.0020.0002.0032]
é 4 => [.119D.0020.0002.0065] [.0000.0032.0002.0301] [*0209.0020.0002.0020] [.113B.0020.0002.0034]
ē 3 => [.119D.0020.0002.0065] [.0000.005B.0002.0304] [*0209.0020.0002.0020] [.113A.0020.0002.0033]
ë 6 => [.119D.0020.0002.0065] [.0000.0047.0002.0308] [*0209.0020.0002.0020] [.113D.0020.0002.0036]

যা নীচের বাছাইয়ের কীগুলিতে গণনা করুন:

e => 119D 0000 0020 0000 0002 0000 0065
é => 119D 0000 0020 0032 0000 0002 0002 0000 0065 0301
ë => 119D 0000 0020 0047 0000 0002 0002 0000 0065 0308
è => 119D 0000 0020 0035 0000 0002 0002 0000 0065 0300
ê => 119D 0000 0020 003C 0000 0002 0002 0000 0065 0302
ē => 119D 0000 0020 005B 0000 0002 0002 0000 0065 0304

এবং:

eA => 119D 1141 0000 0020 0020 0000 0002 0008 0000 0065 0041
éB => 119D 1157 0000 0020 0032 0020 0000 0002 0002 0008 0000 0065 0301 0042
ëC => 119D 116F 0000 0020 0047 0020 0000 0002 0002 0008 0000 0065 0308 0043
èD => 119D 1182 0000 0020 0035 0020 0000 0002 0002 0008 0000 0065 0300 0044
êE => 119D 119D 0000 0020 003C 0020 0000 0002 0002 0008 0000 0065 0302 0045
ēF => 119D 11D5 0000 0020 005B 0020 0000 0002 0002 0008 0000 0065 0304 0046

এবং:

è 1 => 119D 0209 1138 0000 0020 0035 0020 0020 0000 0002 0002 0002 0002 0000 0065 0300 0020 0031
ê 5 => 119D 0209 113C 0000 0020 003C 0020 0020 0000 0002 0002 0002 0002 0000 0065 0302 0020 0035
e 2 => 119D 0209 1139 0000 0020 0020 0020 0000 0002 0002 0002 0000 0065 0020 0032
é 4 => 119D 0209 113B 0000 0020 0032 0020 0020 0000 0002 0002 0002 0002 0000 0065 0301 0020 0034
ē 3 => 119D 0209 113A 0000 0020 005B 0020 0020 0000 0002 0002 0002 0002 0000 0065 0304 0020 0033
ë 6 => 119D 0209 113D 0000 0020 0047 0020 0020 0000 0002 0002 0002 0002 0000 0065 0308 0020 0036

যা আবার এই তিনটি সাজানো ফলাফল দেয়:

e
é
è
ê
ë
ē

এবং

eA
éB
ëC
èD
êE
ēF

এবং

è 1
e 2
ē 3
é 4
ê 5
ë 6

হাই প্যাট্রিক এই বিস্তারিত তথ্য পোস্ট করার জন্য ধন্যবাদ। কয়েকটি নোট: 1) আপনি কোড পৃষ্ঠা 1252 উপেক্ষা করতে পারেন That এটি VARCHAR(অর্থাত্ ইউনিকোডবিহীন) ডেটার জন্য, যা এখানে ব্যবহৃত হচ্ছে না। যে কারণে ēচরিত্রটি ঠিক কাজ করে। 2) "কোলেশন-চার্ট" তথ্যটি কিছুটা পুরানো। এটি এই সংযোগের পূর্ববর্তী সংস্করণের জন্য এবং তারা ২০০৯ সাল থেকে কোনও পোস্ট করেনি 3) এখানে ইউনিকোড সংস্করণটি অবশ্যই সর্বশেষ নয় (সংস্করণ 10)। _100_সিরিজ Collations, এসকিউএল 2008 সাথে আসা তাই এই ইউনিকোড 5.0 বা 5.1 হবে: unicode.org/standard/versions/#TUS_Earlier_Versions
সলোমন Rutzky

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

1) সংস্করণগুলির মধ্যে সম্ভবত কোনও বড় পরিবর্তন হয়নি, তবে আমি খুব নিশ্চিত যে খুব কমপক্ষে ওজন / শ্রেণিবদ্ধকরণ সংশোধন রয়েছে। তবে হ্যাঁ, আমি অবশ্যই সময়ের সীমাবদ্ধতাগুলি পেয়েছি;) 2) সিপি 1252 সম্পর্কিত, আমি এটি উল্লেখ করছিলাম কারণ ইউনিকোডের মধ্যে কোড পৃষ্ঠাগুলির ধারণাটি বিদ্যমান নেই। ইউনিকোড কখনও কোড পৃষ্ঠাগুলির প্রয়োজন না করার একটি মাধ্যম। এমএস ডকটি স্বীকার করে এ বিষয়ে অস্পষ্ট, তবে এটি শীর্ষের দিকে উল্লেখ করে " কোডটি নন-ইউনিকোডের অক্ষর ডেটা সংরক্ষণ করার জন্য ব্যবহৃত পৃষ্ঠা "। আপনি ঠিক বলেছেন যে একটি অক্ষর সিপি 1252 তে নেই তবে কোড পৃষ্ঠা এখানে কার্যকর হয় না।
সলোমন রুটজকি

হ্যাঁ, আমি ইউনিকোড সম্পর্কিত কোড পৃষ্ঠা সম্পর্কে কিছুই বলিনি। এটি কেবলমাত্র এমএস এসকিউএল ডকুমেন্টেশন যা বলে যে এই কোডের নামটি "কোড পৃষ্ঠা 1252" দিয়ে কাজ করে। এটি সম্ভবত কোনও বোধগম্য নয় (এটি আমার কাছে নয়, তবে এটির কোনও ব্যবহারকারী নয়) তবে এই সফ্টওয়্যারটির ডকুমেন্টেশনে যা লেখা আছে তা এটি। চাকরিটি পুনরায় করার ক্ষেত্রে নির্দ্বিধায় বা কেবল চরিত্রের সাথে সম্পর্কিত বাছাই করার পরিবর্তনগুলি এখানে সরবরাহ করতে পারেন ইউনিকোড ৫ এবং সর্বশেষতম, যদি আছে এবং যদি আপনি চান। আমি বিশ্বাস করি যে আমার উত্তরটি যেমন আছে ঠিক ততটাই সঠিক এবং ফলাফলটি অন্যভাবে নয়, ইনপুটের ভিত্তিতে তৈরি করে।
প্যাট্রিক মেভিজেক

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

16

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

  1. বাছাইয়ের তুলনা হয় না:

    দুটি স্ট্রিং একই বা পৃথক কিনা তা নির্ধারণ করা মোটামুটি সোজা এগিয়ে রয়েছে (নির্দিষ্ট কোনও স্থানীয় / ভাষা এবং সংবেদনশীলতার সেট দেওয়া হয়েছে)। তবে 2 বা ততোধিক স্ট্রিংয়ের ক্রম নির্ধারণ করা অত্যন্ত জটিল হতে পারে।

  2. বাছাইকরণ প্রতিটি ধাপে পুরো স্ট্রিংয়ের সাথে প্রয়োগ করা হয়, অক্ষর অনুসারে নয়:

    1. মানক: বেস অক্ষর বাছাই করুন (উচ্চারণ এবং কেস পার্থক্য নির্বিশেষে)
    2. যদি অ্যাকসেন্ট-সংবেদনশীল, অ্যাকসেন্ট / ডায়াক্রিটিক ওজন প্রয়োগ করুন
    3. যদি কেস সংবেদনশীল হয় তবে কেসিং ওজন প্রয়োগ করুন

আপনি যখন col1(একক অক্ষর) অনুসারে বাছাই করেন, এটি প্রথমে নির্ধারণ করে যে সমস্ত অক্ষর সমস্ত " " হওয়ায় সেগুলির ওজন একই have এর পরে, এটি অ্যাকসেন্ট / ডায়াক্রিটিক ওজন প্রয়োগ করে। কোনও কেসিং পার্থক্য নেই তাই তৃতীয় ধাপে কোনও পরিবর্তন হবে না। সুতরাং কেবলমাত্র পার্থক্যগুলি পদক্ষেপ 2 এ রয়েছে, যার কারণে এই সারিগুলির উপর ভিত্তি করে একটি পছন্দসই অর্ডার রয়েছে col1

আপনি যখন col2(দুটি অক্ষর) অনুসারে বাছাই করেন, এটি প্রথমে নির্ধারণ করে যে প্রতিটি সারিতে আলাদা ওজন থাকে যেহেতু উভয় অক্ষর বাছাই করা ওজন নির্ধারণ করতে ব্যবহৃত হয় (যেমন " ea ", " eb " ইত্যাদি)। এর পরে, এটি অ্যাকসেন্ট / ডায়াক্রিটিক ওজন প্রয়োগ করে। কোনও কেসিং পার্থক্য নেই তাই তৃতীয় ধাপে কোনও পরিবর্তন হবে না। সুতরাং এবার 1 এবং 2 ধাপে পার্থক্য রয়েছে। তবে পদক্ষেপ 2 এর ওজন বিবেচনা করার আগেই প্রতিটি স্ট্রিংয়ের মধ্যে ইতিমধ্যে প্রয়োগ করা হয়েছে, দ্বিতীয় ধাপের ওজন ক্রমের উপর কোনও প্রভাব ফেলবে না; তারা কেবল তখনই প্রয়োগ করতে পারে যখন দুই বা ততোধিক সারিগুলির জন্য প্রথম পদক্ষেপের ওজন একই ছিল।

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

সেটআপ

USE [tempdb];

-- DROP TABLE dbo.OddSort;
CREATE TABLE dbo.OddSort
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    col1 NVARCHAR(5) COLLATE Latin1_General_100_CS_AS,
    col2 NVARCHAR(5) COLLATE Latin1_General_100_CS_AS,
    col3 NVARCHAR(5) COLLATE Latin1_General_100_CS_AS
);
GO

INSERT dbo.OddSort (col1, col2, col3)
VALUES (N'e', N'eA', N'e A')
     , (N'ê', N'êE', N'ê E')
     , (N'é', N'éH', N'é H')
     , (N'ë', N'ëC', N'ë C')
     , (N'E', N'EG', N'E G')
     , (N'Ë', N'ëh', N'ë h')
     , (N'è', N'èD', N'è D')
     , (N'é', N'éB', N'é B')
     , (N'ë', N'ëH', N'ë H')
     , (N'ē', N'ēF', N'ē F');

পরীক্ষা 1

SELECT [id], [col1], UNICODE([col1]) AS [CodePoint]
FROM dbo.OddSort 
ORDER BY col1;

রিটার্নস:

id    col1    CodePoint
1     e       101
5     E       69
8     é       233
3     é       233
7     è       232
2     ê       234
4     ë       235
9     ë       235
6     Ë       203
10    ē       275

উপরের ফলাফলগুলিতে আমরা কী দেখতে পাচ্ছি:

  1. কোড পয়েন্টটি সাজানোর ক্রম নির্ধারণ করছে না
  2. উচ্চারণবিহীন অক্ষরগুলি বর্ণিত অক্ষরের আগে বাছাই করা হয় (একই বর্ণের মধ্যে: f এখনও এই সমস্তগুলির পরে আসবে)। স্পষ্টতই, কেস ওয়েটের আগে অ্যাকসেন্ট ওজন প্রয়োগ করা হয়।
  3. একই উচ্চারণযুক্ত (বা অ-উচ্চারণযুক্ত) অক্ষরের মধ্যে (যেমন E তারপর E এবং ë তারপরে within ) এর মধ্যে বড়-বড় আকারের ছোট ছোট ছোট আকারের সাজানো থাকে । এই টেলরিংটি বেশিরভাগ উইন্ডোজ কোলিশেশন ব্যবহার করেন, যখন বেশিরভাগ এসকিউএল সার্ভার কলেশন প্রথমে আপার-কেস সাজান।

পরীক্ষা 2

SELECT [id], [col2]
FROM dbo.OddSort 
ORDER BY col2;

রিটার্নস:

id    col2
1     eA
8     éB
4     ëC
7     èD
2     êE
10    ēF
5     EG
3     éH
6     ëh
9     ëH

উপরের ফলাফলগুলিতে আমরা কী দেখতে পাচ্ছি:

  1. প্রথম স্তরের বাছাই সত্যই বেস অক্ষর। যদি এটি অ্যাকসেন্ট / ডায়রিট্রিক্স হয় তবে ë সি (আইডি = 4), ēF (আইডি = 10), এবং ইজি (আইডি = 5) সারিগুলি যেখানে তারা থাকবে না। যদি এটি কেসিং করা হয়ে থাকে তবে EG (id = 5) সারিটি এটি যেখানে থাকবে না।
  2. দ্বিতীয় স্তরের বাছাই করা সত্যই অ্যাকসেন্টস / ডায়াক্রিটিক্স। এটি ব্যাখ্যা করে যে শেষ তিনটি সারি ëH -> ëH -> ëH এর পরিবর্তে éH -> ëh -> ëH (যেমন আইডি 3 -> 6 -> 9 6 -> 3 -> 9 এর পরিবর্তে 9) হয়।
  3. তৃতীয় স্তরের বাছাই সত্যই ক্যাসিং হয়। লোয়ার- কেসটি প্রথমে সাজানোর কারণে সর্বশেষ 2 টি সারিটি ëh -> ëH হয়

পরীক্ষা 3

SELECT [id], [col3]
FROM dbo.OddSort 
ORDER BY col3;

রিটার্নস:

id    col3
1     e A
8     é B
4     ë C
7     è D
2     ê E
10    ē F
5     E G
3     é H
6     ë h
9     ë H

উপরের ফলাফলগুলিতে আমরা কী দেখতে পাচ্ছি:

  1. সাজানোর ক্রমটি টেস্ট ২-এর মতোই is অত: পর, আমরা জানি যে জন্য সাজানোর ক্রম পার্থক্য কারণ col2প্রশ্নে আবার "মাল্টি লেভেল তুলনা" কারণে, এবং না "কনটেক্সচুয়াল সংবেদনশীলতা"।

অতিরিক্ত নোট:

  1. সঠিক নিয়মগুলি পাওয়ার ক্ষেত্রে এটি যতটা সহজ হওয়া উচিত তত সহজ নয়। এই নিয়মের কংক্রিটের ব্যাখ্যা পেতে সমস্যা হ'ল ইউনিকোড বাছাইয়ের নিয়মগুলি অবশ্যই স্পষ্টভাবে নথিভুক্ত করা একটি সুপারিশ। মাইক্রোসফ্টের মতো বিক্রেতাদের উপর নির্ভর করে those সুপারিশগুলি প্রয়োগ করা। মাইক্রোসফ্ট ইউনিকোড ডকুমেন্টেশনে বর্ণিত ঠিক মতো সুপারিশ কার্যকর করে নি তাই সেখানে সংযোগ বিচ্ছিন্ন হয়ে পড়েছে (এইচটিএমএল বা সিএসএসের বিবরণী পুরোপুরি যেমন কার্যকর হয় না তেমনই একইভাবে, বিক্রেতাদেরও একইভাবে)। তারপরে, উইন্ডোজ কোলিশনের বিভিন্ন সংস্করণ রয়েছে (আপনি 100এসকিউএল সার্ভার ২০০৮ এর সাথে প্রকাশিত সংস্করণটি ব্যবহার করছেন ) এবং এটি ইউনিকোড সংস্করণের সাথে যুক্ত যা ইউনিকোডের বর্তমান সংস্করণ বা আইসিইউ কোলিশন ডেমো থেকে অনেক পুরানোব্যবহার করছে. উদাহরণস্বরূপ, এসকিউএল সার্ভার ২০০৮ -এর "কোলেশন এবং ইউনিকোড সমর্থন" ডকুমেন্টেশনের বিভাগগুলির কি নতুন বিষয় রয়েছে এই _100_সিরিজটিতে "নতুন" কী তা সম্পর্কে দুটি আকর্ষণীয় পয়েন্ট তৈরি করেছে :

    1. ইউনিকোড 5.0 কেস টেবিল।

      ইউনিকোড 5.0 2006 সালের জুলাইয়ে প্রকাশিত হয়েছিল (ভাল, তখন চরিত্রের ডাটাবেসটি প্রকাশিত হয়েছিল, এবং 2006 এর শেষ দিকে পুরো অনুমানটি অনুসরণ করা হয়েছিল)। বর্তমান সংস্করণটি 10.0 যা 2017 সালের জুনে প্রকাশিত হয়েছিল And এবং গত 4 বছরের রিলিজ প্যাটার্নটি দেওয়া হলেও সম্ভবত 11.0 সংস্করণটি 2018 সালের মাঝামাঝি সময়ে চলে আসবে।

    2. আগের তুলনামূলকভাবে ভারী নন-ওজনযুক্ত অক্ষরগুলিতে ওজন যুক্ত করা হয়েছে যা সমানভাবে তুলনা করত।

      এই ওজনগুলি সম্ভবত ইউনিকোড স্ট্যান্ডার্ডে সংজ্ঞায়িত করা বেশি ছিল, কেবল এটির প্রয়োগের ক্ষেত্রে নয়।

     
    তবুও, উপরে লিঙ্কিত ইউসিএ ডকুমেন্টেশন শুরু করার জন্য ভাল জায়গা।

  2. উইন্ডোজ /। নেট / এসকিউএল সার্ভার দ্বারা ব্যবহৃত বাছাই করা কীগুলি ইউনিকোড স্ট্যান্ডার্ড (@ প্যাট্রিকের উত্তর দেখুন) বা আইসিইউতে প্রয়োগ করা হিসাবে ঠিক একই রকম নয় । উইন্ডোজ /। নেট / এসকিউএল সার্ভার কী ব্যবহার করে তা দেখতে, আপনি তুলনা করুন.গেটসোর্টকি পদ্ধতিটি ব্যবহার করতে পারেন । আমি এই মানগুলিতে পাস করতে এবং সাজানোর কীটি পেতে একটি এসকিউএলসিআরআর ইউডিএফ তৈরি করেছি। দয়া করে নোট করুন যে আমি উইন্ডোজ 10 এ .NET ফ্রেমওয়ার্ক 4.5 - 4.6.1 ইনস্টল করে উইন্ডোজ 10 এ এসকিউএল সার্ভার 2017 ব্যবহার করছি, তাই নেট ইউনিকোড 6.0.0 ব্যবহার করা উচিত । এছাড়াও, স্তর 4 এই স্ট্রিংগুলির জন্য ব্যবহৃত হচ্ছে না।

    CHAR    L1     L2     L3     L4
    e      0E21
    E      0E21           12
    ë      0E21    13
    Ë      0E21    13     12

    পরীক্ষা 1 এর জন্য এই বাছাই কীগুলি দেখে এবং বুঝতে পেরেছি যে স্তরগুলি একাধিক কলামের মতো সাজানো হয়েছে একটি ORDER BYধারার মধ্যে (L3 L2 এর একই মানগুলির মধ্যে বাছাই করা হয়েছে, যা L1 এর একই মানের মধ্যে সাজানো হয়েছে), আচরণের কারণটি ব্যাখ্যা করা উচিত প্রশ্নটিতে উল্লিখিত হ'ল ইউনিকোডের মাল্টি-লেভেল বাছাই করার ক্ষমতা। অনুরূপভাবে:

    CHAR       L1         L2       L3       L4
    EG      0E210E25              1212
    éH      0E210E2C      0E      0212
    ëh      0E210E2C      13
    ëH      0E210E2C      13      0212

    টেস্ট 2 এর জন্য কিছু বাছাই করা কীগুলি দেখে আমরা দেখতে পাচ্ছি যে বেস অক্ষরগুলি প্রথমে (L1) সাজানো হয়, তারপরে অ্যাকসেন্টগুলি বাছাই করা হয় (এল 2), এবং তারপরে কেসিংটি সাজানো হয় (এল 3)।

  3. যেহেতু ডেটাটাইপটি হ'ল NVARCHAR, আমরা কেবল ইউনিকোড কোড পয়েন্ট এবং বাছাই করা অ্যালগরিদমগুলির সাথে সম্পর্কিত, সুতরাং UNICODE()টেস্ট ১- এ ফাংশনটির ব্যবহার While যদিও কোড পৃষ্ঠাগুলি বেশিরভাগ কল্যানেশন দ্বারা নির্দিষ্ট করা হয়েছে, সেগুলি কেবল VARCHARডেটা সম্পর্কিত। অর্থ, যখন কোড পৃষ্ঠা 1252 Latin1_General*কলশনগুলির সিরিজ দ্বারা নির্দিষ্ট করা হয়েছে, যা এখানে উপেক্ষা করা যেতে পারে।

  4. ডিফল্ট ইউনিকোড কোলিশন এলিমেন্ট টেবিল (DUCET) ( ভার্সন 5.0.0 যা কোলিশনে _100_সিরিজের মানচিত্র হওয়া উচিত ) বর্ণিত ওজনগুলি মার্কিন ইংরেজির জন্য ঠিক আছে, তবে অন্যান্য স্থানীয় / ভাষা নয়। অন্যান্য ভাষাগুলির DUCET দিয়ে শুরু করতে হবে এবং তারপরে কমন লোকেল ডেটা রিপোজিটরি (সিএলডিআর) প্রকল্প দ্বারা সংজ্ঞায়িত লোকেল-নির্দিষ্ট ওভাররাইড নিয়মগুলি প্রয়োগ করা দরকার। আমি যা বলতে পারি সেগুলি থেকে, সংস্করণগুলি 1.4 / 1.4.1 2006 সালে প্রকাশিত হয়েছিল those এই ওভাররাইডগুলি পেতে, http://unicode.org/Public/cldr/1.4.0/core.zip- এর মাধ্যমে সিএলডিআর 1.4 "কোর" ফাইলটি ডাউনলোড করুন তারপরে, সেই জিপ ফাইলে, কোলেশন ফোল্ডারে যান এবং ব্যবহৃত লোকেলের সাথে সম্পর্কিত XML ফাইলটি সন্ধান করুন। এই ফাইলগুলিতে কেবল ওভাররাইড থাকে এবং কোলিশন নিয়মের সম্পূর্ণ সেট নয়।

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