ইমোজি বা পরিপূরক চরিত্রটিতে আমি কীভাবে একটি এসকিউএল সার্ভার ইউনিকোড / এনভিসার্চার স্ট্রিং সেট করব?


23

আমি ইউনিকোড স্ট্রিং ভেরিয়েবলটিকে ইউনিকোড কোড পয়েন্টের ভিত্তিতে নির্দিষ্ট অক্ষরে সেট করতে চাই।

আমি 65535 ছাড়িয়ে একটি কোড পয়েন্ট ব্যবহার করতে চাই, তবে এসকিউএল সার্ভার ২০০৮ আর 2 ডাটাবেসের একটি সংযোগ রয়েছে SQL_Latin1_General_CP1_CI_AS

মাইক্রোসফ্টের এনসিএইচআর ডকুমেন্টেশন অনুসারে , NCHARফাংশনটি নিম্নলিখিত অনুসারে একটি পূর্ণসংখ্যা গ্রহণ করে:

integer_expression

যখন ডাটাবেসের কোলেশন পরিপূরক চরিত্র (এসসি) পতাকাটি ধারণ করে না, এটি 0 থেকে 65535 (0xFFFF এর মাধ্যমে 0) মাধ্যমে ইতিবাচক পুরো সংখ্যা। যদি এই ব্যাপ্তির বাইরের কোনও মান নির্দিষ্ট করা থাকে তবে NULL ফেরত দেওয়া হয়। পরিপূরক চরিত্রগুলি সম্পর্কে আরও তথ্যের জন্য, কোলেশন এবং ইউনিকোড সমর্থন দেখুন।

যখন ডাটাবেসের কোলেশন পরিপূরক চরিত্র (এসসি) পতাকাটিকে সমর্থন করে, এটি 0 থেকে 1114111 (0x10FFF এর মাধ্যমে 0) মাধ্যমে একটি ধনাত্মক পুরো সংখ্যা। যদি এই ব্যাপ্তির বাইরের কোনও মান নির্দিষ্ট করা থাকে তবে NULL ফেরত দেওয়া হয়।

সুতরাং এই কোড:

SELECT NCHAR(128512);

রিটার্নস NULLএই ডেটাবেসের।

আমি এটির মতো ফিরে আসার জন্য চাই:

SELECT N'😀';

যে কোলেশন "পরিপূরক চরিত্র (এসসি) পতাকা ধারণ করে না" যেখানে একটি ডাটাবেসে কোড ব্যবহার করে ইমোজিটিতে (প্রকৃত ইমোজি চরিত্রটি ব্যবহার না করে) একটি ইউনিকোড স্ট্রিং ভেরিয়েবল (যেমন এনভিচার) সেট করতে পারি?

ইমোজি ইউনিকোড কোড পয়েন্টের সম্পূর্ণ তালিকা

(শেষ পর্যন্ত আমি চাই যে কোনও চরিত্রই কাজ করবে reference আমি কেবল রেফারেন্সের স্বাচ্ছন্দ্যের জন্য ইমোজি বেছে নিয়েছি))

(যদিও সার্ভারটি এসকিউএল সার্ভার ২০০৮ আর 2, তবে পরবর্তী সংস্করণগুলির জন্য কোনও সমাধান সম্পর্কে আমি কৌতূহলী।

কোনও উপায় নেই বলে ধরে নিই, আমি কি অন্য কোনও ডাটাবেসে একটি ইনলাইন ব্যবহারকারী-সংজ্ঞায়িত ফাংশনটি উল্লেখ করতে পারি যার উপযুক্ত কলেজ রয়েছে?

"পরিপূরক চরিত্র" পতাকা রয়েছে এমন একটি জোট আমি কীভাবে খুঁজে পাব?

এটি আমাদের সার্ভারে কোনও রেকর্ড দেয় না:

SELECT * FROM sys.fn_helpcollations() 
WHERE name LIKE 'SQL%[_]SC';

দেখে মনে হচ্ছে এসকিউএল সার্ভার 2012 চালু হয়েছে Latin1_General_100_CI_AS_SCযা কাজ করবে। আপনি পুরানো উদাহরণগুলিতে কোলেশন ইনস্টল করতে পারেন?

কোলেশন রেফারেন্স:

কোলেশন নির্বিশেষে কেন এসকিউএল সার্ভার দৃষ্টিকোণ বাদে প্রসারিত অক্ষরগুলি বুঝতে এবং মোকাবেলা করতে পারে তার জন্য কোনও ব্যাখ্যা আছে NCHAR?


বিস্তৃত অতিরিক্ত তথ্যের জন্য ধন্যবাদ। আমি আর এই সমস্যার মুখোমুখি হচ্ছি না, তবে আমি এই তথ্যটি মানসিকভাবে বুকমার্ক করে রাখব।
রিলে মেজর

1
সমস্যা নেই. আমি মনে করি না যে আপনার এখনও কিছু প্রয়োজন ছিল , কেবলমাত্র আপনি অভিযোজনটি ব্যবহার করতে / প্রশংসা করতে পারেন ...
সোলায়মান রুটজকি

উত্তর:


36

ইউসিএস -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তথ্য এসকিউএল সার্ভারে / ইউনিকোডের ডেটার দুটি দিক ব্যাখ্যা করে :

  1. বেশ কিছু বিল্ট-ইন ফাংশান (শুধুমাত্র NCHAR()) যখন একটি সম্পূরক ক্যারেক্টার-সচেতন কোলেশন ব্যবহার করছেন না সারোগেট পেয়ার / সম্পূরক অক্ষর হ্যান্ডেল না (এসসিএ; সঙ্গে অর্থাত এক _SC, বা _140_ না _BIN*নামে) কারণ অ এসসিএ Collations (বিশেষ করে SQL_কোলেশনস) মূলত ইউটিএফ -16 সমাপ্ত হওয়ার আগে বাস্তবায়িত হয়েছিল (2000 সালের মধ্যে কোনও এক সময়, আমি বিশ্বাস করি)। তুলনামূলক বা বাছাইয়ের ক্ষেত্রে পরিপূরক SQL_চরিত্রগুলির জন্য নন- কোলেশনগুলি _90_বা _100_তাদের নামে রয়েছে তবে _SCপরিপূরক চরিত্রগুলির জন্য ন্যূনতম সমর্থন নেই।
  2. সম্পূর্ণ ইউনিকোড / ইউটিএফ -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 এর উপরে কোড পয়েন্টগুলি দুটি উপায়ে ইনজেক্ট করতে পারেন:

  1. NCHAR()ফাংশনে দুটি কলের ক্ষেত্রে সারোগেট পেয়ারটি নির্দিষ্ট করুন , প্রত্যেকটির জুটির একটি অংশ রয়েছে
  2. 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: সহজেই সমস্ত ইউনিকোড অক্ষর অ্যাক্সেস / গবেষণা করুন (হ্যাঁ, ইমোজিস সহ 😸)


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