কীভাবে একটি "অক্ষর" (যা একাধিক কোড পয়েন্ট সমন্বয়ে গঠিত হতে পারে: সারোগেট জোড়া, অক্ষর সংমিশ্রণ করা ইত্যাদি) অন্যের সাথে কীভাবে তুলনা করা হয় তার বিপরীতে জটিল নিয়মের ভিত্তিতে তৈরি। ইউনিকোডের নির্দিষ্টকরণে বর্ণিত সমস্ত ভাষায় পাওয়া সমস্ত বিবিধ (এবং কখনও কখনও "ওয়াকি") বিধিগুলির জন্য অ্যাকাউন্টিং করার প্রয়োজনের কারণে এটি এত জটিল । এই সিস্টেমটি সমস্ত NVARCHAR
ডেটার জন্য, এবং VARCHAR
একটি উইন্ডোজ কোলেশন ব্যবহার করে এমন ডেটা এবং কোনও এসকিউএল সার্ভার কোলেশন নয় (যার সাথে শুরু হয় SQL_
) ব্যবহার করে non এই সিস্টেমটি কোনও VARCHAR
এসকিউএল সার্ভার কোলেশন ব্যবহার করে ডেটা প্রয়োগ করে না কারণ এটি সাধারণ ম্যাপিংগুলি ব্যবহার করে।
বেশিরভাগ নিয়ম ইউনিকোড কলেশন অ্যালগরিদম (ইউসিএ) এ সংজ্ঞায়িত করা হয়েছে । এই বিধিগুলির কয়েকটি, এবং কিছু ইউসিএ-তে আচ্ছাদিত নয়:
allkeys.txt
ফাইলে দেওয়া ডিফল্ট অর্ডারিং / ওজন (নীচে উল্লিখিত)
- কোন সংবেদনশীলতা এবং বিকল্পগুলি ব্যবহার করা হচ্ছে (উদাহরণস্বরূপ এটি কি সংবেদনশীল বা সংবেদনশীল? এবং যদি সংবেদনশীল হয় তবে এটি কি প্রথম ক্ষেত্রে বড় বা ছোট-বড় হয়?)
- যে কোনও স্থানীয় ভিত্তিক ওভাররাইডগুলি।
- ইউনিকোড স্ট্যান্ডার্ডের সংস্করণটি ব্যবহার করা হচ্ছে।
- "হিউম্যান" ফ্যাক্টর (যেমন ইউনিকোড একটি স্পেসিফিকেশন, সফ্টওয়্যার নয়, এবং এটি প্রয়োগের জন্য প্রতিটি বিক্রেতার কাছে রেখে দেওয়া হয়েছে)
আমি মানবিক ফ্যাক্টর সম্পর্কিত চূড়ান্ত বিষয়টির উপর জোর দিয়েছি বলে আশাবাদীভাবে এটি পরিষ্কার করে দেওয়া উচিত যে এসকিউএল সার্ভারের স্পেসিফিকেশন অনুযায়ী সর্বদা 100% আচরণ করা উচিত নয়।
এখানে ওভাররাইডিং ফ্যাক্টরটি হ'ল প্রতিটি কোড পয়েন্টকে দেওয়া ওজন এবং একাধিক কোড পয়েন্ট একই ওজনের স্পেসিফিকেশন ভাগ করতে পারে। আপনি এখানে বেসিক ওজন (কোনও স্থানীয় নির্দিষ্ট-ওভাররাইড) খুঁজে পাবেন না (আমি বিশ্বাস করি 100
কোলেশনগুলির সিরিজটি ইউনিকোড বনাম 5.0 - মাইক্রোসফ্ট কানেক্ট আইটেমের মন্তব্যে অনানুষ্ঠানিক নিশ্চিতকরণ ):
http://www.unicode.org/Public/UCA/5.0.0/allkeys.txt
প্রশ্নের মধ্যে পয়েন্ট কোড পয়েন্ট - ইউ + এফএফএফডি - সংজ্ঞাযুক্ত:
FFFD ; [*0F12.0020.0002.FFFD] # REPLACEMENT CHARACTER
এই স্বরলিপিটি ইউসিএর 9.1 অ্যালকাই ফাইল ফর্ম্যাটে সংজ্ঞায়িত করা হয়েছে :
<entry> := <charList> ';' <collElement>+ <eol>
<charList> := <char>+
<collElement> := "[" <alt> <weight> "." <weight> "." <weight> ("." <weight>)? "]"
<alt> := "*" | "."
Collation elements marked with a "*" are variable.
আমরা যে কোড পয়েন্টটির দিকে নজর দিচ্ছি তার শেষ লাইনটি গুরুত্বপূর্ণ কারণ একটি স্পেসিফিকেশন রয়েছে যা প্রকৃতপক্ষে "*" দিয়ে শুরু হয়। বিভাগে 6.6 ভেরিয়েবল ওজনকে চারটি সম্ভাব্য আচরণ নির্ধারণ করা হয়েছে, কোলেশন কনফিগারেশন মানগুলির উপর ভিত্তি করে আমাদের প্রত্যক্ষ অ্যাক্সেস নেই (এগুলি প্রতিটি কোলেশনের মাইক্রোসফ্ট বাস্তবায়নে কঠোরভাবে কোডড হয়, যেমন কেস-সংবেদনশীল প্রথমে নিম্ন-কেস ব্যবহার করে বা আপার-কেস প্রথমে, কোলিশেশন এবং অন্যান্য সমস্ত প্রকরণ VARCHAR
ব্যবহার করে ডেটা থেকে আলাদা এমন একটি সম্পত্তি SQL_
)।
কোন পাথ গ্রহণ করা হয়েছে এবং কোন বিকল্পগুলি ব্যবহার করা হচ্ছে তা নির্ধারণ করার জন্য আমার আরও সঠিক গবেষণা করার সময় নেই, তবে আরও দৃ proof় প্রমাণ দেওয়া যেতে পারে, তবে প্রতিটি কোড পয়েন্টের স্পেসিফিকেশনের মধ্যেই কিছু বলা যায় বা না তা বলা নিরাপদ is "সমান" হিসাবে বিবেচনা করা সর্বদা সম্পূর্ণ স্পেসিফিকেশন ব্যবহার করে না। এই ক্ষেত্রে, আমাদের "0F12.0020.0002.FFFD" রয়েছে এবং সম্ভবত এটি ব্যবহৃত হয় মাত্র 2 এবং 3 মাত্রার (যেমন .0020.0002। )। ".0020.0002" এর জন্য নোটপ্যাড ++ এ একটি "কাউন্ট" করছেন। 12,581 টি মিল খুঁজে পেয়েছে (পরিপূরক চরিত্রগুলি সহ যা আমরা এখনও কাজ করি নি)। "[*" "তে" গণনা করা 409 টি ম্যাচ ফেরায়। একটি প্যাটার্ন ব্যবহার করে একটি RegEx "সন্ধান করুন" / "গণনা করুন" করছেন\[\*\d{4}\.0020\.0002
832 ম্যাচ ফেরত। সুতরাং এই সংমিশ্রণের কোথাও কোথাও সম্ভবত কিছু অন্যান্য বিধিও আমি দেখছি না, এবং কিছু মাইক্রোসফ্ট-নির্দিষ্ট প্রয়োগের বিশদ এই আচরণের সম্পূর্ণ ব্যাখ্যা। এবং স্পষ্টতই, আচরণগুলি মিলের সমস্ত চরিত্রের জন্য একই রকম কারণ তারা সবাই একে অপরের সাথে মেলে কারণ নিয়মের প্রয়োগ হওয়ার পরে তাদের সবার ওজন একই হয় (অর্থাত্, এই প্রশ্নটি তাদের কোনও সম্পর্কে জিজ্ঞাসা করা যেতে পারে, না অগত্যা মি। �
)।
আপনি নীচের প্রশ্নের সাথে এবং কোয়েরির নীচের COLLATE
ফলাফল অনুসারে ধারাটি পরিবর্তন করতে পারবেন যে কীভাবে বিভিন্ন সংবেদনশীলতা কোলিশনের দুটি সংস্করণ জুড়ে কাজ করে:
;WITH cte AS
(
SELECT TOP (65536) ROW_NUMBER() OVER (ORDER BY (SELECT 0)) - 1 AS [Num]
FROM [master].sys.columns col
CROSS JOIN [master].sys.objects obj
)
SELECT cte.Num AS [Decimal],
CONVERT(VARBINARY(2), cte.Num) AS [Hex],
NCHAR(cte.Num) AS [Character]
FROM cte
WHERE NCHAR(cte.Num) = NCHAR(0xFFFD) COLLATE Latin1_General_100_CS_AS_WS --N'�'
ORDER BY cte.Num;
বিভিন্ন কোলেশনে মিলিত অক্ষরের বিভিন্ন সংখ্যা নীচে রয়েছে।
Latin1_General_100_CS_AS_WS = 5840
Latin1_General_100_CS_AS = 5841 (The "extra" character is U+3000)
Latin1_General_100_CI_AS = 5841
Latin1_General_100_CI_AI = 6311
Latin1_General_CS_AS_WS = 21,229
Latin1_General_CS_AS = 21,230
Latin1_General_CI_AS = 21,230
Latin1_General_CI_AI = 21,537
উপরে তালিকাভুক্ত সমস্ত জোটে সত্যকেও N'' = N'�'
মূল্যায়ন করে।
হালনাগাদ
আমি আরও কিছু গবেষণা করতে সক্ষম হয়েছি এবং আমি যা পেয়েছি তা এখানে:
এটি "সম্ভবত" কীভাবে কাজ করা উচিত
আইসিইউ কোলেশন ডেমো ব্যবহার করে , আমি লোকালটিকে "এন-ইউএস-ইউ-ভি-পপিক্স" এ সেট করেছি, "প্রাইমারী" তে শক্তি সেট করেছিলাম, "সারণি কীগুলি" দেখায়, এবং নিম্নলিখিত 4 টি অক্ষরে আমি কপি করেছি উপরের ক্যোয়ারীর ফলাফল ( Latin1_General_100_CI_AI
কলেশন ব্যবহার করে ):
�
Ԩ
ԩ
Ԫ
এবং এটি ফিরে আসে:
Ԫ
60 2E 02 .
Ԩ
60 7A .
ԩ
60 7A .
�
FF FD .
তারপরে, http://unicode.org/cldr/utility/character.jsp?a=fffd এ " " এর জন্য অক্ষর বৈশিষ্ট্যগুলি পরীক্ষা করে দেখুন এবং দেখুন যে স্তর 1 বাছাই কী (যেমন FF FD
) "uca" বৈশিষ্ট্যের সাথে মেলে। সেই "ইউসিএ" বৈশিষ্ট্যটি ক্লিক করা আপনাকে অনুসন্ধান পৃষ্ঠায় নিয়ে যায় - http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3 অউকা ৯৩ ডিএফএফএফডিটি 3 এ ৯৫ ডি - মাত্র ১ টি ম্যাচ দেখাচ্ছে। এবং, allkeys.txt ফাইলে, স্তর 1 বাছাই ওজন হিসাবে দেখানো হয়েছে 0F12
, এবং এর জন্য কেবল 1 টি মিল আছে।
আমরা আচরণটি সঠিকভাবে ব্যাখ্যা করছি তা নিশ্চিত করার জন্য, আমি অন্য একটি চরিত্রের দিকে নজর রেখেছি Ὸ
: http://unicode.org/cldr/u टिल/character.jsp?a=1FF8- এ ভারিয়ার সাথে গ্রেট ক্যাপিটাল লেটার ওমিক্রন (ইউএসিএ) রয়েছে ( অর্থাত্ স্তর 1 বাছাই ওজন / কোলটিং উপাদান) এর 5F30
। "5F30" এ ক্লিক করা আমাদের একটি অনুসন্ধান পৃষ্ঠায় নিয়ে যায় - http://unicode.org/cldr/utility/list-unicodeset.jsp?a=%5B%3 আউকা%3D5F30%3A%5D - 30 টি ম্যাচ দেখাচ্ছে, 20 টির মধ্যে এগুলি 0 - 65535 পরিসরে (উদাঃ U + 0000 - U + FFFF) এর মধ্যে রয়েছে। কোড পয়েন্ট 1 এফএফ 8 এর জন্য allkeys.txt ফাইলটিতে সন্ধান করে আমরা একটি স্তরের 1 ধরণের ওজন দেখতে পাই । নোটপ্যাড ++ এ "কাউন্ট" করছেন12E0
12E0.
30 টি ম্যাচ দেখায় (এটি ইউনিকোড.অর্গ.র ফলাফলগুলির সাথে মেলে, যদিও এটি ফাইলটি ইউনিকোড বনাম 5.0 এর জন্য যেহেতু এটির গ্যারান্টিযুক্ত নেই এবং সাইটটি ইউনিকোড ভি 9.0 ডেটা ব্যবহার করছে)।
এসকিউএল সার্ভারে, নিম্নলিখিত পরিসংখ্যানগুলি 10 টি পরিপূরক অক্ষরগুলি সরানোর সময় ইউনিকোড.অর্গ অনুসন্ধানের মতো 20 টি ম্যাচ দেয়:
;WITH cte AS
(
SELECT TOP (65535) ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS [Num]
FROM [master].sys.columns col
CROSS JOIN [master].sys.objects obj
)
SELECT cte.Num AS [Decimal],
CONVERT(VARCHAR(50), CONVERT(VARBINARY(2), cte.Num), 2) AS [Hex],
NCHAR(cte.Num) AS [Character]
FROM cte
WHERE NCHAR(cte.Num) = NCHAR(0x1FF8) COLLATE Latin1_General_100_CI_AI
ORDER BY cte.Num;
এবং, কেবলমাত্র নিশ্চিত হয়েই, আইসিইউ কোলেশন ডেমো পৃষ্ঠায় ফিরে যাওয়া এবং এসকিউএল সার্ভারের 20 টি ফলাফলের তালিকা থেকে নেওয়া 3 অক্ষরের সাথে "ইনপুট" বাক্সে অক্ষরগুলি প্রতিস্থাপন:
Ὂ
𝜪
Ὸ
দেখায় যে তাদের, প্রকৃতপক্ষে, সবার সমান 5F 30
ওজন একই স্তরের (অক্ষরের বৈশিষ্ট্য পৃষ্ঠায় "uca" ক্ষেত্রের সাথে মিল রয়েছে)।
তাই হয়, এটা অবশ্যই যেন এই বিশেষ চরিত্র উচিত বলে মনে হচ্ছে না না অন্য কিছু মেলে না।
এটি আসলে কীভাবে কাজ করে (অন্তত মাইক্রোসফ্ট-ল্যান্ডে)
এসকিউএল সার্ভারের বিপরীতে, .NET এর সাথে CompareInfo.GetSortKey পদ্ধতিটির মাধ্যমে স্ট্রিংয়ের জন্য বাছাই কী দেখানোর উপায় রয়েছে । এই পদ্ধতিটি ব্যবহার করে এবং কেবলমাত্র ইউ + এফএফএফডি অক্ষরটি অতিক্রম করে, এটির একটি সাজানোর কী প্রদান করে 0x0101010100
। তারপরে, 0 - 65535 এর পরিসরের সমস্ত চরিত্রের মধ্যে পুনরাবৃত্তিটি দেখতে 0x0101010100
কোনটির 4500 ম্যাচের ফিরতি কী রয়েছে তা দেখতে । এটি এসকিউএল সার্ভারে ফিরে আসা 5840-এর সাথে ঠিক মিলছে না ( Latin1_General_100_CS_AS_WS
কোলেশন ব্যবহার করার সময় ) তবে আমি উইন্ডোজ 10 এবং .NET ফ্রেমওয়ার্ক সংস্করণ 4.6.1 চালিয়ে যাচ্ছি আমরা এখনই পেতে পারি (ইউনিকোড ভি ব্যবহার করে) CharUnicodeInfo ক্লাসের চার্ট অনুযায়ী 6.3.0("কলকারীদের কাছে দ্রষ্টব্য" তে "মন্তব্যগুলি" বিভাগে)। এই মুহুর্তের জন্য আমি একটি এসকিউএলসিএলআর ফাংশন ব্যবহার করছি এবং তাই লক্ষ্য ফ্রেমওয়ার্ক সংস্করণটি পরিবর্তন করতে পারে না। আমি যখন সুযোগ পাব তখন আমি একটি কনসোল অ্যাপ্লিকেশন তৈরি করব এবং ইউনিকোড বনাম 5.0 ব্যবহার করে এটির লক্ষ্যমাত্রার ফ্রেমওয়ার্ক সংস্করণ 4.5 ব্যবহার করব, যা 100 সিরিজের সমাহারগুলির সাথে মেলে।
কী এই পরীক্ষাটি শো, এমনকি .NET এবং U + এ FFFD জন্য SQL সার্ভার মধ্যে মিলের সঠিক একই নম্বর ছাড়া, এটা প্রশংসনীয় স্পষ্ট যে এই হল না SQL সার্ভার-নির্দিষ্ট আচরণ, এবং ইচ্ছাকৃত বা বাস্তবায়ন ভুল যে কাজ কিনা মাইক্রোসফ্ট দ্বারা, ইউ + এফএফএফডি অক্ষরটি সত্যিকার অর্থে বেশ কয়েকটি চরিত্রের সাথে মেলে, এমনকি এটি ইউনিকোড নির্দিষ্টকরণ অনুসারে না হওয়া উচিত। এবং, এই চরিত্রটি ইউ +0000 (নাল) এর সাথে মেলে, এটি সম্ভবত ওজন হারিয়ে যাওয়ার সমস্যা।
করাও
=
ক্যোয়ারী বনাম ক্যোয়ারিতে আচরণের পার্থক্য সম্পর্কে LIKE N'%�%'
, এটি ওয়াইল্ডকার্ড এবং অনুপস্থিত (আমার ধারণা) এই � Ƕ Ƿ Ǹ
অক্ষরগুলির জন্য ওজনগুলির সাথে সম্পর্কিত । যদি LIKE
শর্তটি সরলভাবে পরিবর্তিত হয় LIKE N'�'
তবে এটি =
শর্ত হিসাবে একই 3 টি সারি দেয় । যদি ওয়াইল্ডকার্ডগুলির সাথে সমস্যাটি "অনুপস্থিত" ওজনগুলির কারণে না হয় ( বিটিডব্লু 0x00
দ্বারা কোনও সাজানোর কী নেই CompareInfo.GetSortKey
) তবে এটি অক্ষরগুলির কারণে এমন কোনও সম্পত্তি থাকার কারণে হতে পারে যা প্রাসঙ্গিকের ভিত্তিতে বাছাই কীটি পরিবর্তিত হতে পারে (যেমন পার্শ্ববর্তী অক্ষরগুলি )।
FFFD
(*0F12.0020.0002.FFFD
কেবল অনুসন্ধানে একটি ফলাফলের সন্ধান করা হচ্ছে)। @ ফরেস্টের পর্যবেক্ষণ থেকে যে তারা সকলেই খালি স্ট্রিংয়ের সাথে মেলে এবং এই বিষয়ে আরও কিছুটা পড়ার মত মনে হচ্ছে যে তারা বিভিন্ন নন-বাইনারি কোলেশনগুলিতে যে ওজন ভাগ করে নিচ্ছে তা আসলে আমার বিশ্বাস শূন্য।