উত্তর:
এসকিউএল সার্ভারের কোলিশেশন চরিত্রের ডেটা মেলা এবং বাছাইয়ের নিয়মগুলি নির্ধারণ করে। সাধারণত, আপনি তুলনামূলক শব্দার্থক এবং ডেটা গ্রাহকদের প্রয়োজনীয় ক্রম সাজানোর উপর ভিত্তি করে প্রথমে একটি কোলেশন চয়ন করবেন।
মানুষ সাধারণত এটি খুঁজে পায় না যে বাইনারি কোলিশগুলি তাদের প্রত্যাশিত বাছাই এবং তুলনা আচরণ তৈরি করে। সুতরাং, যদিও এগুলি সেরা পারফরম্যান্স দেয় (বিশেষত খাঁটি কোড পয়েন্ট বিআইএন 2 সংস্করণ) বেশিরভাগ বাস্তবায়ন সেগুলি ব্যবহার করে না।
কাঁচা কর্মক্ষমতা শর্তাদির পরে (তবে কেবল অ-ইউনিকোড স্ট্রিংগুলির জন্য) পশ্চাদপদ-সামঞ্জস্যের এসকিউএল কোলিশেশন । ইউনিকোড ডেটা নিয়ে কাজ করার সময়, এই কোলিশগুলি একই কর্মক্ষমতা বৈশিষ্ট্যগুলির পরিবর্তে উইন্ডোজ কোলেশন ব্যবহার করে। এখানে সূক্ষ্ম ফাঁদ রয়েছে, সুতরাং আপনার আজকাল এসকিউএল কোলেশন চয়ন করার উপযুক্ত কারণ থাকতে হবে (কোনও মার্কিন সিস্টেমে কাজ না করা, যেখানে এটি এখনও ডিফল্ট রয়েছে)।
জটিল ইউনিকোড তুলনা এবং বাছাইয়ের নিয়মের কারণে উইন্ডোজ কোলিশনগুলি সাধারণভাবে ধীরতম। তবুও, এসকিউএল সার্ভারে এইগুলি উইন্ডোজের সাথে সম্পূর্ণ সামঞ্জস্যতা অফার করে এবং ইউনিকোড স্ট্যান্ডার্ডের পরিবর্তনগুলি নিয়মিত রাখতে বজায় থাকে। ইউনিকোড ডেটা অন্তর্ভুক্ত আধুনিক ব্যবহারের জন্য, একটি উইন্ডোজ কোলেশন সাধারণত প্রস্তাবিত হয়।
টি এল; ডিআর
যদি আপনি চান সমস্ত ক্ষেত্রে সংবেদনশীল তুলনা এবং বাছাই শব্দার্থবিজ্ঞান, আপনার _CS_
যে কোনও বেস কোলেশন আপনার ব্যবহারকারীর ভাষা এবং সংস্কৃতির জন্য প্রত্যাশিত আচরণ সরবরাহ করে (কেস সংবেদনশীল জন্য) প্রকরণটি নির্বাচন করা উচিত । উদাহরণস্বরূপ, এই উভয়ই কেস-সংবেদনশীল সমষ্টি:
-- Latin1-General, case-sensitive, accent-sensitive
Latin1_General_CS_AS
-- Latin1-General, case-sensitive, accent-sensitive for Unicode Data,
-- SQL Server Sort Order 51 on Code Page 1252 for non-Unicode Data
SQL_Latin1_General_CP1_CS_AS
আপনি sys.fn_helpcolifications ব্যবহার করে এই সংজ্ঞাগুলি দেখতে পারেন
চারটি টেবিল যা সমাহার ব্যতীত হুবহু একই; একটি বাইনারি, একটি কেস সংবেদনশীল, একটি কেস সংবেদনশীল এবং একটি এসকিউএল কেস সংবেদনশীল:
CREATE TABLE #Example_BIN
(
string nvarchar(50)
COLLATE Latin1_General_BIN
NOT NULL
);
CREATE TABLE #Example_CS
(
string nvarchar(50)
COLLATE Latin1_General_CS_AI
NOT NULL
);
CREATE TABLE #Example_CI
(
string nvarchar(50)
COLLATE Latin1_General_CI_AI
NOT NULL
);
CREATE TABLE #Example_SQL
(
string varchar(50) -- Note varchar
COLLATE SQL_Latin1_General_CP1_CS_AS
NOT NULL
);
প্রতিটি টেবিলের জন্য একই নমুনা ডেটা :
INSERT #Example_BIN
(string)
VALUES
(N'A'),
(N'a'),
(N'B'),
(N'b'),
(N'C'),
(N'c');
INSERT #Example_CS
SELECT EB.string
FROM #Example_BIN AS EB;
INSERT #Example_CI
SELECT EB.string
FROM #Example_BIN AS EB;
INSERT #Example_SQL
SELECT EB.string
FROM #Example_BIN AS EB;
এখন আমরা 'এ' এর চেয়ে বড় স্ট্রিংগুলি খুঁজতে চাই :
SELECT EB.string AS BIN
FROM #Example_BIN AS EB
WHERE EB.string > N'a'
ORDER BY EB.string;
SELECT EC.string AS CS
FROM #Example_CS AS EC
WHERE EC.string > N'a'
ORDER BY EC.string;
SELECT EC2.string AS CI
FROM #Example_CI AS EC2
WHERE EC2.string > N'a'
ORDER BY EC2.string;
SELECT ES.string AS SQL
FROM #Example_SQL AS ES
WHERE ES.string > 'a' -- not Unicode
ORDER BY ES.string;
╔═════╗
║ BIN ║
╠═════╣
║ b ║
║ c ║
╚═════╝
╔════╗
║ CS ║
╠════╣
║ A ║
║ b ║
║ B ║
║ c ║
║ C ║
╚════╝
╔════╗
║ CI ║
╠════╣
║ B ║
║ b ║
║ C ║
║ c ║
╚════╝
╔═════╗
║ SQL ║
╠═════╣
║ B ║
║ b ║
║ C ║
║ c ║
╚═════╝
তবে খেয়াল করুন, আমরা যদি এসকিউএল কোলেশন সহ একটি ইউনিকোড আক্ষরিক ব্যবহার করি তবে অন্তর্নিহিত রূপান্তর নিয়মের ফলে উইন্ডোজ কোলেশন তুলনা হয়:
SELECT ES.string AS SQL
FROM #Example_SQL AS ES
WHERE ES.string > N'a'
ORDER BY ES.string;
... এবং এসকিউএল কোলেশন ফলাফল পরিবর্তন :
╔═════╗
║ SQL ║
╠═════╣
║ A ║
║ B ║
║ b ║
║ C ║
║ c ║
╚═════╝
প্রদত্ত যে এটি একটি বিদ্যমান ডাটাবেস যা এর মধ্যে ইতিমধ্যে সংযুক্ত টেবিল রয়েছে, ডিএমএল অপেরেশনের সম্ভাব্য কার্যকারিতা প্রভাব ছাড়াই (যা আসলে ইতিমধ্যে ছিল) এর বাইরে ডাটাবেস কল্যানেশন পরিবর্তনের ক্রিয়ায় কিছু গুরুতর জরুরী প্রভাব রয়েছে। কর্মক্ষমতা এবং কার্যকারিতার খুব বাস্তব প্রভাব রয়েছে এবং এই পরিবর্তনটি কেবল লক্ষ্যযুক্ত লক্ষ্য অর্জন করতে পারেনি (কমপক্ষে ধারাবাহিকভাবে নয়), তবে ঠিক একইভাবে আচরণটি পরিবর্তিত করা হয়েছে (বা নতুন টেবিলগুলি তৈরি করার সময় আচরণকে পরিবর্তন করবে) কিভাবে ডেটা অর্ডার এবং সমান হয়।
পল ইতিমধ্যে তার উত্তরে বিভিন্ন ধরণের কোলেশনগুলির মধ্যে কর্মক্ষমতা এবং আচরণের পার্থক্যের ভাল ব্যাখ্যা এবং উদাহরণ সরবরাহ করেছেন, তাই আমি এখানে এটি পুনরাবৃত্তি করব না। তবে কয়েকটি পয়েন্টের জন্য কিছু অতিরিক্ত বিশদ প্রয়োজন এবং একটি নতুন ডিবি-র কোলেশন স্থাপনের বিপরীতে বিদ্যমান ডিবি-র কোলেশন পরিবর্তনের বর্তমান দৃশ্যের সাথে যোগ করার জন্য আরও কয়েকটি পয়েন্ট রয়েছে।
বাইনারি কোলিশগুলি কেবল কেস-সংবেদনশীলের চেয়ে বেশি: এগুলি সংবেদনশীল সবকিছু ! সুতরাং, বাইনারি কোলেশন ব্যবহার করে ( _BIN
বা শেষ হওয়া _BIN2
) আপনার তুলনাগুলি এখন অ্যাকসেন্ট সংবেদনশীল, কানা সংবেদনশীল, প্রস্থ সংবেদনশীল এবং সম্ভাব্য আঠালো সংবেদনশীল (কমপক্ষে এটি আজকের দিনের ট্রেন্ড বলে মনে হচ্ছে ;-))। এটি কি এই পরিবর্তনটি করার কাঙ্ক্ষিত প্রভাব ফেলছিল? শেষ ব্যবহারকারীরা কি এই আচরণের পরিবর্তনের প্রত্যাশা করছেন?
কোলেশনগুলি কেবল তুলনা নয়, বাছাইয়ের ক্ষেত্রেও প্রভাব ফেলে। একটি বাইনারি কোলেশন সাজানোর উপর ভিত্তি করে হবে ASCII
বা UNICODE
বাইট মান (তার উপর নির্ভর করে VARCHAR
বা NVARCHAR
প্রতিটি যথাক্রমে) বাইট । সুতরাং, বাইনারি কোলেশন নির্বাচন করে আপনি সংস্কৃতিটির বর্ণমালা অনুসারে ভাষা / সংস্কৃতি- নির্দিষ্ট ওজন সংক্রান্ত নিয়মগুলি প্রতি প্রতিটি অক্ষরকে (এমনকি কিছু ভাষার অক্ষর যেমন হাঙ্গেরিয়ান ভাষায় 2 টি বর্ণ রয়েছে) অর্ডার করে থাকেন। সুতরাং, যদি "সিএইচ" প্রাকৃতিকভাবে "কে" পরে আসে তবে ভাল, এটি বাইনারি কোলেশন ব্যবহার করে ঘটবে না। আবার, এটি কি এই পরিবর্তনটি করার কাঙ্ক্ষিত প্রভাব ফেলল? শেষ ব্যবহারকারীরা কি এই আচরণের পরিবর্তনের প্রত্যাশা করছেন?
আপনার অ্যাপ্লিকেশনটির জন্য নির্দিষ্ট পিছনে-সামঞ্জস্যতার প্রয়োজনীয়তা না থাকলে আপনার অবশ্যই কোলিশগুলির BIN2
পরিবর্তে ব্যবহার করা উচিত BIN
, ধরে নেওয়া উচিত, আপনি প্রথম স্থানে বাইনারি কোলেশন চাইছেন। এই কোলিশগুলিBIN2
এসকিউএল সার্ভার ২০০৫ সালে প্রবর্তিত হয়েছিল এবং বিএন এবং বিআইএন ২ কোলিশেশন ব্যবহারের গাইডলাইনগুলির জন্য এমএসডিএন পৃষ্ঠা অনুসারে :
এসকিউএল সার্ভারে আগের বাইনারি কোলিশানগুলি, "_BIN" দিয়ে শেষ হওয়া, ইউনিকোড ডেটার জন্য অসম্পূর্ণ কোড-পয়েন্ট-টু-কোড-পয়েন্ট তুলনা সম্পাদন করেছে। পুরাতন এসকিউএল সার্ভারের বাইনারি কোলিশগুলি ডাব্লুসিএইচআর হিসাবে প্রথম চরিত্রের সাথে তুলনা করে, তারপরে একটি বাইট-বাই-বাইট তুলনা করে।
...
সত্য কোড-পয়েন্ট তুলনাগুলির সুবিধা নিতে আপনি [_BIN2] বাইনারি কোলিশনে স্থানান্তর করতে পারেন এবং নতুন অ্যাপ্লিকেশনগুলির বিকাশের জন্য আপনার নতুন বাইনারি কোলিশ ব্যবহার করা উচিত।
আরও বলে রাখা উচিত যে _BIN2
collations সুবিধামত আচরণ মেলে Ordinal
বিকল্প StringComparison এনুমারেশন এই ধরনের তুলনা, এবং হিসাবে যারা একই অপারেশন SQL সার্ভার মধ্যে সঞ্চালিত হচ্ছে বিকল্প ব্যবহার করে একই ফলাফল উত্পাদ হবে .NET কোডে কাজ বাছাই (যখন ব্যবহার _BIN2
collations, অবশ্যই)।
_BIN2
কোলেশন সম্পর্কে সবেমাত্র যা বলা হয়েছে তার অনুরূপ কারণে , যদি না আপনার পশ্চাত-সামঞ্জস্যতা আচরণ বজায় রাখার জন্য নির্দিষ্ট প্রয়োজনীয়তা না থাকে তবে আপনার উইন্ডোজ কোলেশনগুলি ব্যবহার করার দিকে ঝুঁকতে হবে এসকিউএল সার্ভার-নির্দিষ্ট কোলেশনগুলি নয় (যেমন শুরু হওয়াগুলি SQL_
এখন বিবেচিত হবে) কিন্ডা "sucky" ;-))।
ইউনিকোড ডেটা ব্যবহারের সময় (অর্থাত স্ট্রিং সঙ্গে পূর্বে সমাধান N
অথবা যেখানে ডাটাটাইপ হিসাবে নির্দিষ্ট করা হয়েছে অ্যাপ্লিকেশন কোড থেকে SQL সার্ভার উদ্ভেদ NChar
বা NVarChar
), আমি দেখতে পাচ্ছি না কিভাবে অন্য বনাম এক কোলেশন ব্যবহার ঢোকাতে অথবা একটি আপডেট করার জন্য একটি পার্থক্য করতে হবে NCHAR
বা NVARCHAR
স্ট্রিং ক্ষেত্র ।
অ-ইউনিকোড তথ্য ব্যবহার করে, বা মধ্যে ঢোকাতে বা বের একটি অ-ইউনিকোড ক্ষেত্র, তারপর নির্দিষ্ট কোলেশন (ডাটাবেস বা ক্ষেত্র) আপডেট করার সময় হতে পারে যদি কোন অক্ষর সন্নিবেশিত হচ্ছে / আপডেট প্রয়োজন একটি ছোট ভূমিকা পালন অনুবাদ করা, অথবা mapable নয় (হয় কোলেশন দ্বারা সংজ্ঞায়িত কোড পৃষ্ঠা দ্বারা নির্দিষ্ট হিসাবে এটি এমনকি একটি শব্দ?) অবশ্যই, যখনই কেউ অ-ইউনিকোড ডেটা বা ডেটা ধরণের ব্যবহার করছে এবং এই ডিবি কোলেশন পরিবর্তনের এই দৃশ্যের সাথে সুনির্দিষ্ট নয় তখনই এই সম্ভাব্য সমস্যাটি উপস্থিত রয়েছে। এই পরিবর্তনটি স্ট্রিং লিটারেলগুলিকে প্রভাব ফেলবে (যা ডিবি কোলেশন ক্ষেত্রের জোটের চেয়ে আলাদা থাকলে ইতিমধ্যে একটি সমস্যা হয়ে থাকতে পারে)। ডিবি কোলেশনে কোনও পরিবর্তন না করা সত্ত্বেও অন্যান্য ডিবি বা এসকিউএল সার্ভারের (যে কোনও ক্লায়েন্ট কোড) বাইরে থেকে আসা ডেটাতে কোনও অক্ষর থাকতে পারে এবং কোনও নির্দিষ্ট এনকোডিং থাকতে পারে।
অনেক গুরুত্বপূর্ণ!!! ডাটাবেস ডিফল্ট কল্যানেশন পরিবর্তন করার সময়, বিদ্যমান সারণীতে বিদ্যমান স্ট্রিং ক্ষেত্রগুলির জন্য নির্দিষ্ট কোলাশনের কোনও পরিবর্তন হবে না , তবে যে কোনও নতুন ক্ষেত্রে ডেটাবেস ডিফল্টের একটি কোলেশন থাকবে (ক্লজটির মাধ্যমে ওভাররাইড না করা থাকলে COLLATE
)। এটি আপনার প্রশ্নের উপর তিনভাবে প্রভাব ফেলবে:
1) যদি কোনও নতুন ক্ষেত্রের সাথে বিদ্যমান বিদ্যমান ক্ষেত্রগুলির যে কোনওটিতে যোগদান করে, আপনি একটি কোলেশন মেলেনি ত্রুটি পাবেন:
USE [master];
GO
IF (DB_ID(N'ChangeCollationTest') IS NOT NULL)
BEGIN
PRINT 'Dropping [ChangeCollationTest] DB...';
ALTER DATABASE [ChangeCollationTest]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
DROP DATABASE [ChangeCollationTest];
END;
GO
PRINT 'Creating [ChangeCollationTest] DB...';
CREATE DATABASE [ChangeCollationTest]
COLLATE SQL_Latin1_General_CP1_CI_AS;
GO
USE [ChangeCollationTest];
GO
CREATE TABLE [CollateTest-SQL_Latin1_General_CP1_CI_AS]
(Col1 NVARCHAR(50) COLLATE DATABASE_DEFAULT, Col2 NVARCHAR(50));
SELECT *
FROM sys.columns sc
WHERE sc.[object_id] = OBJECT_ID(N'[CollateTest-SQL_Latin1_General_CP1_CI_AS]');
-- "collation_name" for both fields shows: SQL_Latin1_General_CP1_CI_AS
GO
USE [master];
GO
ALTER DATABASE [ChangeCollationTest]
COLLATE Latin1_General_BIN2;
GO
USE [ChangeCollationTest];
GO
CREATE TABLE [CollateTest-Latin1_General_BIN2]
(Col1 NVARCHAR(50) COLLATE DATABASE_DEFAULT, Col2 NVARCHAR(50));
SELECT *
FROM sys.columns sc
WHERE sc.[object_id] = OBJECT_ID(N'[CollateTest-Latin1_General_BIN2]');
-- "collation_name" for both fields shows: Latin1_General_BIN2
GO
SELECT *
FROM dbo.[CollateTest-SQL_Latin1_General_CP1_CI_AS] ctSQL
INNER JOIN dbo.[CollateTest-Latin1_General_BIN2] ctWIN
ON ctWIN.Col1 = ctSQL.Col1;
রিটার্নস:
Msg 468, Level 16, State 9, Line 4
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and
"Latin1_General_BIN2" in the equal to operation.
2) বিদ্যমান টেবিলগুলির বিদ্যমান ক্ষেত্রগুলিতে পূর্বাভাস / ফিল্টারগুলি (পূর্ববর্তী ডিফল্ট কোলিশনে সেট করা হয়) যা স্ট্রিং লিটারেল বা ভেরিয়েবলগুলির সাথে তুলনা করে ত্রুটি ঘটবে না, তবে এসকিউএল সার্ভারের সমষ্টি সমান করার প্রয়োজনের কারণে তারা অবশ্যই কার্য সম্পাদন অনুযায়ী প্রভাবিত হতে পারে উভয় পক্ষ এবং স্বয়ংক্রিয়ভাবে স্ট্রিংকে আক্ষরিক বা পরিবর্তনশীল ক্ষেত্রের কোলেশনে রূপান্তর করে। "প্রকৃত সম্পাদন পরিকল্পনা অন্তর্ভুক্ত করুন" (কন্ট্রোল-এম) সক্ষম করুন এবং তারপরে নিম্নলিখিতগুলি সম্পাদন করুন (ধরে নিবেন যে আপনি ইতিমধ্যে উপরে দেখানো অনুসন্ধানগুলি চালিয়েছেন):
SELECT *
FROM dbo.[CollateTest-SQL_Latin1_General_CP1_CI_AS] ctSQL
WHERE ctSQL.Col1 = N'a';
-- Unspecified collations on string literals and variables assume the database default
-- collation. This mismatch doesn't cause an error because SQL Server adds a
-- "[Col1]=CONVERT_IMPLICIT(nvarchar(4000),[@1],0)" but it can hurt performance.
SELECT *
FROM dbo.[CollateTest-Latin1_General_BIN2] ctWIN
WHERE ctWIN.Col1 = N'a';
-- No CONVERT_IMPLICIT; plan shows "[Col1]=[@1]".
3) এবং, অন্তর্নিহিত রূপান্তরগুলির কথা বলার জন্য লক্ষ্য করুন যে এটি স্ট্রিংটি কীভাবে আক্ষরিক (ডাটাবেস ডিফল্ট কল্যানেশনের একটি অন্তর্নিহিত কোলাশনের সাথে Latin1_General_BIN2
) রূপান্তরিত হয়, সারণির ক্ষেত্র নয় । এই ফিল্টারটি কেস-সংবেদনশীল (পুরাতন কোলেশন) বা কেস-সংবেদনশীল (নতুন কোলেশন) হবে কিনা তা নিয়ে কোনও অনুমান? দেখার জন্য নিম্নলিখিত চালান:
INSERT INTO dbo.[CollateTest-SQL_Latin1_General_CP1_CI_AS] (Col1)
VALUES (N'a'), (N'A');
SELECT ctSQL.Col1
FROM dbo.[CollateTest-SQL_Latin1_General_CP1_CI_AS] ctSQL
WHERE ctSQL.Col1 = N'a';
রিটার্নস:
Col1
----
a
A
ডি আহা! এই কোয়েরির জন্য কেবলমাত্র একটি সামান্য (বা আরও তাত্পর্যপূর্ণ?) পারফরম্যান্স হিট CONVERT_IMPLICIT()
নয়, তবে এটি পছন্দসই কেস-সংবেদনশীল পদ্ধতিতেও আচরণ করে না।
তবুও, যদি ইতিমধ্যে টেবিল রয়েছে এমন কোনও ডিবিতে কোলেশন পরিবর্তন করা হয়, তবে হ্যাঁ, কর্মক্ষমতা এবং কার্যকারিতা উভয়ই প্রভাবিত হয়।
যদি কোল্যাশনটি কোনও নতুন ডিবিতে স্থাপন করা হচ্ছে, তবে পল ইতিমধ্যে এটি ব্যাখ্যা করেছিলেন যে কীভাবে একটি বাইনারি কোলেশন, যদিও দ্রুত, সম্ভবত যেভাবে প্রত্যাশা বা আকাঙ্ক্ষিত হবে তা সাজান না।
এটিও লক্ষ করা উচিত যে আপনি সর্বদা শর্ত অনুযায়ী শর্তগুলি নির্দিষ্ট করতে পারেন। ক্রমসজ্জিত দফা যোগ করা যেতে পারে WHERE
শর্ত, ORDER BY
এবং অধিকাংশ কোন স্থান, যা একটি স্ট্রিং গ্রহণ করে।
উদাহরণ 1 (যেখানে শর্ত):
SELECT tmp.col AS [SQL-CaseSensitive]
FROM (VALUES ('a'), ('A'), ('b'), ('B')) tmp(col)
WHERE tmp.col > 'a' COLLATE SQL_Latin1_General_CP1_CS_AS;
SELECT tmp.col AS [Windows-CaseSensitive]
FROM (VALUES ('a'), ('A'), ('b'), ('B')) tmp(col)
WHERE tmp.col > 'a' COLLATE Latin1_General_CS_AI;
রিটার্নস:
SQL-CaseSensitive
-----------------
b
B
Windows-CaseSensitive
-----------------
A
b
B
উদাহরণ 2 (বাই অর্ডার):
SELECT tmp.col AS [Windows-CaseSensitive]
FROM (VALUES ('a'), ('A'), ('b'), ('B')) tmp(col)
ORDER BY tmp.col COLLATE Latin1_General_CS_AI;
SELECT tmp.col AS [Windows-Binary]
FROM (VALUES ('a'), ('A'), ('b'), ('B')) tmp(col)
ORDER BY tmp.col COLLATE Latin1_General_BIN2;
রিটার্নস:
Windows-CaseSensitive
-----------------
a
A
b
B
Windows-Binary
-----------------
A
B
a
b
উদাহরণ 3 (যদি বিবৃতি):
IF ('A' = 'a') SELECT 1 AS [DatabaseDefault-CaseInsensitive?];
-- if the DB is not case-sensitive or binary, returns 1
IF ('A' = 'a' COLLATE Latin1_General_BIN2) SELECT 2 AS [Windows-Binary];
রিটার্নস:
DatabaseDefault-CaseInsensitive?
--------------------------------
1
{nothing}
উদাহরণ 4 (ফাংশন ইনপুট প্যারামিটারের সাথে যুক্ত):
SELECT UNICODE(N'🂡') AS [UCS-2],
UNICODE(N'🂡' COLLATE Latin1_General_100_CI_AS_SC) AS [UTF-16];
-- This character is a Unicode supplemental character and is not part of the
-- default UCS-2 encoding. In order for built-in functions to handle these
-- characters correctly, either the DB default collation needs to end in
-- "_SC" (available as of SQL Server 2012), or use as shown here.
-- See the character in more detail here: http://unicode-table.com/en/1F0A1/
রিটার্নস:
UCS-2 UTF-16
------ -------
55356 127137
55,356 এর ইউসিএস -2 মান আংশিকভাবে সঠিক কারণ এটি "সারোগেট জোড়" এর দুটি মানের মধ্যে প্রথম। তবে সুস্পষ্টভাবে _SC
কোলেশনটি দেওয়া না হলে , UNICODE()
ফাংশনটি প্রতিটি অক্ষরকে কেবল ডাবল-বাইট মান হিসাবে দেখতে পারে এবং ডাবল ডাবল-বাইট সারোগেট জুটি কীভাবে সঠিকভাবে পরিচালনা করতে পারে তা জানে না।
হালনাগাদ
এমনকি উপরোক্ত সমস্ত উদাহরণের সাথে, কেস সংবেদনশীল তুলনাগুলির একটি দিক যা সাধারণত উপেক্ষা করা হয় এবং বাইনারি তুলনা / কোলিশেশন দ্বারা উপেক্ষিত হয় তা হ'ল ইউনিকোডের অংশ হ'ল সাধারনকরণ (রচনা এবং পচন)।
উদাহরণ 5 (যখন একটি বাইনারি তুলনা হয় না কেস সংবেদনশীল):
সত্যিকারের কেস-সংবেদনশীল তুলনাগুলি এমন অক্ষরগুলির সংমিশ্রণের জন্য অনুমতি দেয় যা অন্য একটি চরিত্রের সাথে মিশ্রিত হয়ে অন্য একটি অক্ষর তৈরি করে যা ইতিমধ্যে অন্য ইউনিকোড কোড পয়েন্ট হিসাবে উপস্থিত রয়েছে। কেস-সংবেদনশীল তুলনাগুলি প্রদর্শনযোগ্য অক্ষর সম্পর্কে যত্নশীল, কোড পয়েন্ট (গুলি) তৈরি করার জন্য নয় not
SELECT 'Equal' AS [Binary],
NCHAR(0x00FC) AS [ü],
N'u' + NCHAR(0x0308) AS [u + combining diaeresis]
WHERE NCHAR(0x00FC) COLLATE Latin1_General_100_BIN2
= N'u' + NCHAR(0x0308) COLLATE Latin1_General_100_BIN2
-- No result as they are a different number of code points,
-- as well as being different code points.
SELECT 'Equal' AS [Case-Sensitive],
NCHAR(0x00FC) AS [ü],
N'u' + NCHAR(0x0308) AS [u + combining diaeresis]
WHERE NCHAR(0x00FC) COLLATE Latin1_General_100_CS_AS -- ü
= N'u' + NCHAR(0x0308) COLLATE Latin1_General_100_CS_AS -- u + combining diaeresis
-- Result set returned, even being a different number of code points AND Accent Sensitive,
-- due to normalization
রিটার্নস:
Binary ü u + combining diaeresis
------- --- -------------------------
{nothing}
Case-Sensitive ü u + combining diaeresis
--------------- --- -------------------------
Equal ü ü
সত্যিকারের কেস-সংবেদনশীল তুলনাগুলি প্রশস্ত অক্ষরগুলিকে তাদের অ-বিস্তৃত সমতুল্য হিসাবে সমান করার অনুমতি দেয়।
IF (N'sofia' = N'sofia' COLLATE Latin1_General_100_BIN2)
SELECT 'Values are the same' AS [Binary]
ELSE
SELECT 'Values are different' AS [Binary];
IF (N'sofia' = N'sofia' COLLATE Latin1_General_100_CS_AS)
SELECT 'Values are the same' AS [Case-Sensitive]
ELSE
SELECT 'Values are different' AS [Case-Sensitive];
রিটার্নস:
Binary
---------------
Values are different
Case-Sensitive
---------------
Values are the same
_BIN
এবং _BIN2
) collations হয় না কেস সংবেদনশীল!