ইউসিএস -2 এনকোডিংটি সর্বদা অক্ষর প্রতি 2 বাইট হয় এবং এর পরিসীমা 0 - 65535 (0x0000 - 0xFFFF) থাকে। ইউটিএফ -16 (বিগ এন্ডিয়ান বা লিটল এন্ডিয়ান নির্বিশেষে) এর পরিসীমা 0 - 1114111 (0x0000 - 0x10FFF) রয়েছে। 0 - 65535 / 0x0000 - ইউটিএফ -16 এর 0xFFFF পরিসীমা প্রতি বাইট 2 বাইট হয় যখন 65536 / 0xFFFF এর উপরে পরিসীমা অক্ষর প্রতি 4 বাইট হয়।
উইন্ডোজ এবং এসকিউএল সার্ভার ইউসিএস -২ এনকোডিংটি ব্যবহার শুরু করেছে কারণ এটি উপলব্ধ ছিল এবং ইউটিএফ -16 এখনও চূড়ান্ত হয়নি। ভাগ্যক্রমে, তবে ইউসিএস -2 এবং ইউটিএফ -16 এর নকশাগুলিতে যথেষ্ট পূর্ব-চিন্তাভাবনা ছিল যে ইউসিএস -2 ম্যাপিংগুলি ইউটিএফ -16 ম্যাপিংগুলির একটি সম্পূর্ণ উপসেট (যার অর্থ: 0 - 65535 / 0x0000 - 0xFFF পরিসীমা ইউটিএফ -16 এর ইউসিএস -2)। এবং, 65536 - 1114111 (0x10000 - 0x10FFFF) UTF-16 রেঞ্জটি ইউসিএস -2 পরিসরে দুটি কোড পয়েন্ট থেকে নির্মিত হয়েছে (0xD800 - 0xDBFF এবং 0xDFF, বিশেষত) এই উদ্দেশ্যে সংরক্ষণ করা হয়েছিল এবং অন্যথায় কোনও নেই অর্থ। দুটি কোড পয়েন্টের এই সংমিশ্রণটি একটি সারোগেট পেয়ার হিসাবে পরিচিত, এবং সারোগেট পেয়ারগুলি ইউসিএস -২ পরিসরের বাইরে অক্ষরগুলি উপস্থাপন করে যা পরিপূরক চরিত্র হিসাবে পরিচিত।
এই সমস্ত NVARCHAR
তথ্য এসকিউএল সার্ভারে / ইউনিকোডের ডেটার দুটি দিক ব্যাখ্যা করে :
- বেশ কিছু বিল্ট-ইন ফাংশান (শুধুমাত্র
NCHAR()
) যখন একটি সম্পূরক ক্যারেক্টার-সচেতন কোলেশন ব্যবহার করছেন না সারোগেট পেয়ার / সম্পূরক অক্ষর হ্যান্ডেল না (এসসিএ; সঙ্গে অর্থাত এক _SC
, বা _140_
না _BIN*
নামে) কারণ অ এসসিএ Collations (বিশেষ করে SQL_
কোলেশনস) মূলত ইউটিএফ -16 সমাপ্ত হওয়ার আগে বাস্তবায়িত হয়েছিল (2000 সালের মধ্যে কোনও এক সময়, আমি বিশ্বাস করি)। তুলনামূলক বা বাছাইয়ের ক্ষেত্রে পরিপূরক SQL_
চরিত্রগুলির জন্য নন- কোলেশনগুলি _90_
বা _100_
তাদের নামে রয়েছে তবে _SC
পরিপূরক চরিত্রগুলির জন্য ন্যূনতম সমর্থন নেই।
- সম্পূর্ণ ইউনিকোড / ইউটিএফ -16 অক্ষর সেট
NVARCHAR
/ NCHAR
/ XML
/ NTEXT
ডেটাটাইপগুলিতে কোনও ডেটা ক্ষতি ছাড়াই সংরক্ষণ করা যায় কারণ ইউসিএস -2 এবং ইউটিএফ -16 হুবহু একই বাইট সিকোয়েন্স। পার্থক্যটি হ'ল ইউটিএফ -১ 16 সার্গেট পেয়ারগুলি নির্মাণের জন্য সার্গেট কোড পয়েন্টগুলি ব্যবহার করে এবং ইউসিএস -২ কেবল কোনও অক্ষরে ম্যাপ করতে পারে না, তাই তারা বিল্ট-ইন ফাংশনগুলিতে দুটি অজানা অক্ষর হিসাবে উপস্থিত হয়।
সেই ব্যাকগ্রাউন্ড তথ্যটি মাথায় রেখে আমরা এখন নির্দিষ্ট প্রশ্নগুলির মধ্য দিয়ে যেতে পারি:
আমি SELECT NCHAR(128512);
এই হিসাবে একই ফিরে আসতে চাই :SELECT N'😀';
এটি কেবলমাত্র তখনই ঘটতে পারে যেখানে ক্যোয়ারী কার্যকর করা হচ্ছে - যেখানে একটি ডিফল্ট কোলেশন রয়েছে যা পরিপূরক চরিত্র-সচেতন, এবং সেগুলি এসকিউএল সার্ভার ২০১২-এ প্রবর্তিত হয়েছিল string স্ট্রিং ইনপুট পরামিতিগুলি অন্তর্নির্মিত ফাংশনগুলি কোলেশন সরবরাহ করতে পারে COLLATE
ধারা (যেমন LEN(N'string' COLLATE Some_Collation_SC)
) এর মাধ্যমে ইনলাইন করুন এবং এসসিএর ডিফল্ট কোলেশন রয়েছে এমন কোনও ডাটাবেসের মধ্যেই কার্যকর করা দরকার না । তবে অন্তর্নির্মিত ফাংশন যেমন NCHAR()
একটি INT
ইনপুট প্যারামিটার গ্রহণ করা এবং COLLATE
ধারাটি সেই প্রসঙ্গে বৈধ নয় (এই কারণেই NCHAR()
কেবলমাত্র পরিপূরক অক্ষর সমর্থন করে যখন বর্তমান ডাটাবেসে একটি ডিফল্ট কোলেশন থাকে যা পরিপূরক-অক্ষর-সচেতন; তবে এটি একটি অপ্রয়োজনীয় অসুবিধা যা পরিবর্তিত হতে পারে, সুতরাং দয়া করে আমার পরামর্শের জন্য ভোট দিন:এনসিএইচএআর () ফাংশনটি সর্বদা 0x10000 - 0x10FFFF সক্রিয় ডাটাবেসের ডিফল্ট সংযোগ নির্বিশেষে মানগুলির পরিপূরক চরিত্রটি ফিরিয়ে আনতে হবে ।
কোলেশন নির্বিশেষে কেন এসকিউএল সার্ভার দৃষ্টিকোণ বাদে প্রসারিত অক্ষরগুলি বুঝতে এবং মোকাবেলা করতে পারে তার জন্য কোনও ব্যাখ্যা আছে NCHAR
?
এসকিউএল সার্ভার কীভাবে ডেটা ক্ষতি ছাড়াই পরিপূরক চরিত্রগুলি সঞ্চয় এবং পুনরুদ্ধার করতে পারে তা এই উত্তরের উপরের অংশে ব্যাখ্যা করা হয়েছিল। তবে, এটি সত্য নয় যে NCHAR
পরিপূরক চরিত্রগুলির সাথে একমাত্র অন্তর্নির্মিত ফাংশন রয়েছে (যখন কোনও এসসিএ কোলেশন ব্যবহার করবেন না)। উদাহরণস্বরূপ, LEN(N'😀' COLLATE SQL_Latin1_General_CP1_CI_AS)
2 এর মান প্রদান করে যখন LEN(N'😀' COLLATE Latin1_General_100_CI_AS_SC)
1 এর মান দেয়।
আপনি যদি প্রশ্নটিতে পোস্ট করা দ্বিতীয় লিঙ্কে যান (অর্থাত্ "মাইক্রোসফ্টের পরিপূরক অক্ষর সমাহার তথ্য") এবং কিছুটা নিচে স্ক্রল করেন তবে আপনি বিল্ট-ইন ফাংশনগুলির একটি চার্ট দেখতে পাবেন এবং কীভাবে কার্যকর কোলেশনের ভিত্তিতে তারা আচরণ করে।
"পরিপূরক চরিত্র" পতাকা রয়েছে এমন একটি জোট আমি কীভাবে খুঁজে পাব?
২০১২ এর আগে এসকিউএল সার্ভারের একটি সংস্করণে আপনি পারবেন না। তবে, এসকিউএল সার্ভার ২০১২ দিয়ে শুরু করে আপনি নিম্নলিখিত কোয়েরিটি ব্যবহার করতে পারেন:
SELECT col.*
FROM sys.fn_helpcollations() col
WHERE col.[name] LIKE N'%[_]SC'
OR col.[name] LIKE N'%[_]SC[_]%'
OR (COLLATIONPROPERTY(col.[name], 'Version') = 3
AND col.[name] NOT LIKE N'%[_]BIN%');
আপনার ক্যোয়ারীটি নিকটে ছিল, তবে প্যাটার্নটি শুরু হয়েছিল SQL
এবং এসকিউএল সার্ভার কোলিশেশনগুলি (যার সাথে শুরু হয় SQL_
) কিছুক্ষণের জন্য উইন্ডোজ কোলিশনের পক্ষে (যারা শুরু করেনি SQL_
) তাদের পক্ষে অবহেলা করা হয়েছে । সুতরাং, SQL_
কলশনগুলি আপডেট হচ্ছে না এবং অতএব এমন কোনও নতুন সংস্করণ নেই যা _SC
বিকল্পটি অন্তর্ভুক্ত করবে (এবং এসকিউএল সার্ভার ২০১৩ থেকে শুরু করে, সমস্ত নতুন কোলেশন স্বয়ংক্রিয়ভাবে পরিপূরক অক্ষরকে সমর্থন করে এবং _SC
পতাকাটির দরকার নেই বা নেই, এবং হ্যাঁ, ক্যোয়ারী এর জন্য অ্যাকাউন্টগুলির তত্ক্ষণাত _UTF8
এসকিউএল সার্ভার 2019-এ যুক্ত হওয়া কোলিশেশনগুলি অবিলম্বে দেখানো হয়েছে )।
আপনি পুরানো উদাহরণগুলিতে কোলেশন ইনস্টল করতে পারেন?
না, আপনি এসকিউএল সার্ভারের পূর্ববর্তী সংস্করণে কলশন ইনস্টল করতে পারবেন না।
যে কোলেশন "পরিপূরক চরিত্র (এসসি) পতাকা ধারণ করে না" যেখানে একটি ডাটাবেসে কোড ব্যবহার করে (প্রকৃত পরিপূরক চরিত্রটি ব্যবহার না করে) একটি পরিপূরক চরিত্রের জন্য একটি ইউনিকোড স্ট্রিং ভেরিয়েবল (যেমন এনভিচার) সেট করতে পারি?
...
যদিও সার্ভারটি এসকিউএল সার্ভার ২০০৮ আর 2, তবে পরবর্তী সংস্করণগুলির কোনও সমাধান সম্পর্কে আমিও আগ্রহী।
এসসিএ কোলেশন ব্যবহার না করার সময়, আপনি 65535 / U + FFFF এর উপরে কোড পয়েন্টগুলি দুটি উপায়ে ইনজেক্ট করতে পারেন:
NCHAR()
ফাংশনে দুটি কলের ক্ষেত্রে সারোগেট পেয়ারটি নির্দিষ্ট করুন , প্রত্যেকটির জুটির একটি অংশ রয়েছে
VARBINARY
লিটল এন্ডিয়ান (অর্থাত্ বিপরীত) বাইট সিকোয়েন্সের রূপ রূপান্তর করার ক্ষেত্রে সারোগেট পেয়ারটি নির্দিষ্ট করুন ।
পরিপূরক চরিত্রগুলি / সারোগেট পেয়ারগুলি সন্নিবেশ করার এই দুটি পদ্ধতি কার্যকর ফলস্বরূপ পরিপূরক চরিত্র-সচেতন হওয়া সত্ত্বেও কার্যকর হবে এবং এসকিউএল সার্ভারের সমস্ত সংস্করণে ঠিক একইভাবে কাজ করা উচিত, কমপক্ষে ২০০৫ সালের মতো (যদিও সম্ভবত এতে কাজ করবে) এসকিউএল সার্ভার 2000 পাশাপাশি)।
উদাহরণ:
- ক্যারেক্টার:
💩
- নাম: পাইল অফ পো
- দশমিক: 128169
- কোড পয়েন্ট: U + 1F4A9
- সারোগেট পেয়ার: ইউ + ডি 83 ডি এবং ইউ + ডিএফ 21
SELECT N'💩', -- 💩
UNICODE(N'💩' COLLATE Latin1_General_100_CI_AS), -- 55357
UNICODE(N'💩' COLLATE Latin1_General_100_CI_AS_SC), -- 128169
NCHAR(128169), -- 💩 in DB with _SC Collation, else NULL
NCHAR(0x1F4A9), -- 💩 in DB with _SC Collation, else NULL
CONVERT(VARBINARY(4), 128169), -- 0x0001F4A9
CONVERT(VARBINARY(4), N'💩'), -- 0x3DD8A9DC
CONVERT(NVARCHAR(10), 0x3DD8A9DC), -- 💩 (regardless of DB Collation)
NCHAR(0xD83D) + NCHAR(0xDCA9) -- 💩 (regardless of DB Collation)
হালনাগাদ
আপনি 65536 - 1114111 (0x010000 - 0x10FFF) এর মধ্যে যে কোনও কোড পয়েন্ট থেকে সুরোগেট জুড়ি মানগুলি (উভয় INT
এবং BINARY
ফর্ম) পেতে নিম্নলিখিত আইটিভিএফ ব্যবহার করতে পারেন । এবং, ইনপুট প্যারামিটারটি টাইপ করার সময় INT
, আপনি কোড পয়েন্টের বাইনারি / হেক্স আকারে পাস করতে পারেন এবং এটি স্পষ্টভাবে সঠিক সংখ্যার মানটিতে রূপান্তর করবে।
CREATE FUNCTION dbo.GetSupplementaryCharacterInfo(@CodePoint INT)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN
WITH calc AS
(
SELECT 55232 + (@CodePoint / 1024) AS [HighSurrogateINT],
56320 + (@CodePoint % 1024) AS [LowSurrogateINT]
WHERE @CodePoint BETWEEN 65536 AND 1114111
)
SELECT @CodePoint AS [CodePointINT],
HighSurrogateINT,
LowSurrogateINT,
CONVERT(VARBINARY(3), @CodePoint) AS [CodePointBIN],
CONVERT(BINARY(2), HighSurrogateINT) AS [HighSurrogateBIN],
CONVERT(BINARY(2), LowSurrogateINT) AS [LowSurrogateBIN],
CONVERT(binary(4), NCHAR(HighSurrogateINT) + NCHAR(LowSurrogateINT)) AS [UTF-16LE],
NCHAR(HighSurrogateINT) + NCHAR(LowSurrogateINT) AS [Character]
FROM calc;
GO
উপরের ফাংশনটি ব্যবহার করে নিম্নলিখিত দুটি ক্যোয়ারী:
SELECT * FROM dbo.GetSupplementaryCharacterInfo(128169);
SELECT * FROM dbo.GetSupplementaryCharacterInfo(0x01F4A9);
উভয়ই নিম্নলিখিতটি ফেরত দেয়:
CodePoint HighSurrogate LowSurrgate CodePoint HighSurrgate LowSurrgate UTF-16LE Char
INT INT INT BIN BIN BIN actr
128169 55357 56489 0x01F4A9 0xD83D 0xDCA9 0x3DD8A9DC 💩
আপডেট 2: একটি আরও ভাল আপডেট!
আমি উপরে প্রদর্শিত আইটিভিএফটিকে এখন 188,657 কোড পয়েন্ট ফেরতের জন্য মানিয়ে নিয়েছি যাতে আপনার এটির কোনও নির্দিষ্ট মান ফিট করার দরকার নেই। অবশ্যই, একটি টিভিএফ WHERE
হওয়ায় আপনি একটি নির্দিষ্ট কোড পয়েন্ট, বা কোড পয়েন্টের পরিসীমা, বা "অনুরূপ অক্ষর" ইত্যাদি ইত্যাদিতে ফিল্টার করার জন্য একটি ধারা যোগ করতে পারেন এবং এতে প্রতিটি কোডটি তৈরির জন্য প্রাক-ফর্ম্যাট করা এ্যাসিক সিকোয়েন্স সহ অতিরিক্ত কলামগুলি অন্তর্ভুক্ত রয়েছে টি-এসকিউএল, এইচটিএমএল এবং সি-স্টাইলের (যেমন \xHHHH
) উভয় বিন্দু (বিএমপি এবং পরিপূরক উভয় অক্ষর )। এখানে এটি সম্পর্কে পড়ুন:
এসএসএমএস টিপ # 3: সহজেই সমস্ত ইউনিকোড অক্ষর অ্যাক্সেস / গবেষণা করুন (হ্যাঁ, ইমোজিস সহ 😸)