এই অক্ষরগুলি এসকিউএল সার্ভারে কেন সমান?


20

আমি ঠিক এটি পাই না। এই এসকিউএল কোয়েরি দেখুন:

select nchar(65217) -- ﻁ
select nchar(65218) -- ﻂ
select nchar(65219) -- ﻃ
select nchar(65220) -- ﻄ
if nchar(65217) = nchar(65218)
    print 'equal'
if nchar(65217) = nchar(65219)
    print 'equal'
if nchar(65217) = nchar(65220)
    print 'equal'

ট্রানজিটিভ সম্পর্কের ভিত্তিতে , এর অর্থ হ'ল এসকিউএল সার্ভার তাদের সকলকে একই চরিত্র হিসাবে বিবেচনা করে।

তবে অন্যান্য পরিবেশে উদাহরণস্বরূপ সি # বলুন, সেগুলি একই নয়।

আমি যা সম্পর্কে বিভ্রান্ত তা হ'ল:

  1. এসকিউএল সার্ভারে স্ট্রিং তুলনা কীভাবে কাজ করে
  2. তুলনা কেন একটি মেশিন এবং একটি প্ল্যাটফর্মের ক্ষেত্রে একই আচরণ করে না, তবে বিভিন্ন পরিবেশে
  3. এই 4 টি অক্ষর একটি মানব-বোধগম্য চরিত্রকে উপস্থাপন করে। ইউনিকোড চরিত্রের মানচিত্রে এগুলি এত বেশি কেন?

অবশ্যই এটি প্রচুর সমস্যার কারণ, কারণ আমি একটি পাঠ্য-প্রক্রিয়াকরণ অ্যাপ্লিকেশন নিয়ে কাজ করছি এবং ডেটা প্রায় সর্বত্র থেকে আসে এবং এটি প্রক্রিয়াকরণের আগে আমার পাঠ্যকে স্বাভাবিক করতে হবে।

আমি যদি পার্থক্যের কারণ জানি তবে আমি এটি হ্যান্ডেল করার জন্য কোনও সমাধান খুঁজে পেতে পারি। ধন্যবাদ.

উত্তর:


28

এসকিউএল সার্ভারের সমস্ত চরিত্রের ডেটা একটি কোলেশনের সাথে সম্পর্কিত, যা অক্ষরগুলির ডোমেন এবং সেইসাথে ডেটা তুলনা এবং বাছাইয়ের জন্য ব্যবহৃত নিয়মগুলি নির্ধারণ করে। কোলেশন ইউনিকোড এবং নন-ইউনিকোড ডেটা উভয় ক্ষেত্রেই প্রযোজ্য।

এসকিউএল সার্ভারে 3 বিস্তৃত শ্রেণীর সংগ্রহগুলি অন্তর্ভুক্ত রয়েছে: বাইনারি, উত্তরাধিকার এবং উইন্ডোজ। বাইনারি বিভাগে ( _BINপ্রত্যয়) কোলেশনগুলি অন্তর্নিহিত কোড পয়েন্টগুলি তুলনা করতে ব্যবহার করে তাই সমতা তুলনা যদি সমান তুলনা না করে তবে কোড পয়েন্ট বর্ণ নির্বিশেষে পৃথক হয়। উত্তরাধিকার ( SQL_উপসর্গ) এবং উইন্ডোজ কোলিশেশন আরও প্রাকৃতিক অভিধানের নিয়মের জন্য বাছাই এবং তুলনা শব্দার্থতাকে সরবরাহ করে। এটি কেস, অ্যাকসেন্ট, প্রস্থ এবং কানা তুলনা বিবেচনা করতে দেয়। উইন্ডোজ কোলেশনগুলি আরও শক্তিশালী word-sortনিয়ম সরবরাহ করে যা উইন্ডোজ ওএসের সাথে ঘনিষ্ঠভাবে প্রান্তিক হয় যদিও উত্তরাধিকার সূত্রগুলি কেবলমাত্র একক অক্ষর বিবেচনা করে।

নীচের উদাহরণটি উইন্ডো এবং টেথ অক্ষরের সাথে বাইনারি কোলেশনগুলির মধ্যে পার্থক্য তুলে ধরে:

CREATE TABLE dbo.WindowsColationExample
    (
      Character1 nchar(1) COLLATE Arabic_100_CI_AS_SC
    , Character2 nchar(1) COLLATE Arabic_100_CI_AS_SC
    , Character3 nchar(1) COLLATE Arabic_100_CI_AS_SC
    , Character4 nchar(1) COLLATE Arabic_100_CI_AS_SC
    );

CREATE TABLE dbo.BinaryColationExample
    (
      Character1 nchar(1) COLLATE Arabic_100_BIN
    , Character2 nchar(1) COLLATE Arabic_100_BIN
    , Character3 nchar(1) COLLATE Arabic_100_BIN
    , Character4 nchar(1) COLLATE Arabic_100_BIN
    );

INSERT  INTO dbo.BinaryColationExample
VALUES  ( NCHAR(65217), NCHAR(65218), NCHAR(65219), NCHAR(65220) );
INSERT  INTO dbo.WindowsColationExample
VALUES  ( NCHAR(65217), NCHAR(65218), NCHAR(65219), NCHAR(65220) );

--all characters compare not equal
SELECT *
FROM dbo.BinaryColationExample
WHERE
    character1 = character2
    OR character1 = character3
    OR character1 = character4
    OR character2 = character3
    OR character2 = character4
    OR character3 = character4;

--all characters compare equal
SELECT *
FROM dbo.WindowsColationExample
WHERE character1 = character2;
SELECT *
FROM dbo.WindowsColationExample
WHERE character1 = character3;
SELECT *
FROM dbo.WindowsColationExample
WHERE character1 = character4;
SELECT *
FROM dbo.WindowsColationExample
WHERE character2 = character3;
SELECT *
FROM dbo.WindowsColationExample
WHERE character2 = character4;
SELECT *
FROM dbo.WindowsColationExample
WHERE character3 = character4;

ইউনিকোডে কেন অভিন্ন গ্লাইফগুলির জন্য বিভিন্ন কোড পয়েন্ট থাকতে পারে তার কারণগুলি http://en.wikedia.org/wiki/ নকল_চ্যাকার্টার_ইন_উনিকোডে বর্ণিত হয়েছে । আমি সংক্ষিপ্তসারটি বলছি, এটি উত্তরাধিকারের সামঞ্জস্যের জন্য হতে পারে বা অক্ষরগুলি সাধারণভাবে সমতুল্য নয়। লক্ষ্য করুন যে টেথ চরিত্রটি বিভিন্ন ভাষায় ব্যবহৃত হয় ( http://en.wikedia.org/wiki/Teth )।


15

এটি COLLATIONআপনার ডেটাবেসটির সাথে কিছু করার আছে ( বিওএল-এ আরও তথ্য )।

আপনার যে নির্দিষ্ট চরিত্রের সমস্যা রয়েছে সেটির ভাষা সম্পর্কে আমি পুরোপুরি নিশ্চিত নই (আমি এই থ্রেডের উপর ভিত্তি করে ফার্সি অনুমান করছি ), তবে আপনি যদি সাম্যতা অপারেটরে সঠিক কোলেশন উল্লেখ করেন তবে সঠিক ফলাফল পাবেন।

if nchar(65217) COLLATE Persian_100_BIN = nchar(65218) COLLATE Persian_100_BIN 
    print 'equal'; -- nothing returned
if nchar(65217)  COLLATE Persian_100_BIN  = nchar(65217)  COLLATE Persian_100_BIN 
    print 'equal'; -- prints 'equal'
if nchar(65217) COLLATE Latin1_General_CI_AI = nchar(65220) COLLATE Latin1_General_CI_AI
    print 'equal'; -- prints 'equal'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.