কিছু আরবি অক্ষরকে অভিন্ন হিসাবে আচরণ করে


10

আরবিতে আমাদের কাছে ا (আলেফ) এবং أ (হামজার সাথে আলেফ) চরিত্র রয়েছে।

ব্যবহারকারীরা এগুলি বিনিময়যোগ্যভাবে লিখেন এবং আমরা সেগুলি আন্তরজাগরণযোগ্যভাবে অনুসন্ধান করতে চাই। এসকিউএল সার্ভার তাদের পৃথক অক্ষর হিসাবে বিবেচনা করে। আমি কীভাবে এসকিউএলকে একই চরিত্র হিসাবে বিবেচনা করতে পারি?

আমি মনে করি যে কোনও any (আলেফকে হামজার সাথে) সন্নিবেশ করানোর সাথে প্রতিস্থাপন করব তবে আমাদের কাছে আরবি ভাষায় প্রচুর বিকল্প রয়েছে কেবল আ (আলেফ) এবং أ (হামজার সাথে আলেফ) নয়।

আমি চেষ্টা Arabic_CI_ASএবং Arabic_CI_AIকিন্তু যে সমস্যা সমাধানের নেই।

সমস্যাটি পুনঃজেনার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে:

CREATE TABLE [dbo].[TestTable] (
    [ArabicChars] [nvarchar](50) NOT NULL,

    CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
    (
       [ArabicChars] ASC
    )
) ON [PRIMARY];


INSERT INTO TestTable values (N'احمد');
INSERT INTO TestTable values (N'أحمد');

SELECT * 
FROM TestTable 
WHERE ArabicChars like N'ا%';

ফলাফল হলো:

ArabicChars 

احمد

(1 row(s) affected)

কাঙ্ক্ষিত ফলাফলটি inোকানো সারিগুলির উভয়ই।


সমস্যা নেই. অ্যারন বারট্রান্ডের একটি দুর্দান্ত ছোট স্ক্রিপ্ট রয়েছে যা আপনি সমস্ত সম্ভাব্য কোলেশনগুলি পরীক্ষা করার জন্য মানিয়ে নিতে পারেন। যাইহোক, আমার সন্দেহ হয় কোনও মিলনই এই দুটি চরিত্রকে একই বিবেচনা করবে না।
নিক চ্যামাস

তবে নাম হিসাবে বর্ণিত নামগুলিতে আপনার দুটি পৃথক অক্ষর রয়েছে, যা কমপক্ষে উপস্থিত রয়েছে। এবং অবশ্যই, আমি তাদের পৃথক ا and أ
চরিত্র

3
@ নিকচ্যামাস যেমন আপনি অনুমান করেছিলেন যে কোনও আরবী চরিত্রের জন্য সাউন্ডেক্স () 0000 ফেরৎ
জর্জ বোট্রোস

1
@ নিকচ্যামাস: যা তখন সমস্যা: ব্যবহারকারীর আচরণ + অনুমান কঠোর কোলেশন আচরণের থেকে পৃথক।
জিবিএন

1
@ জিবিএন - এগুলি পৃথক চিঠি বলে দেওয়া হয়েছে, আমি বলব সমস্যাটি ব্যবহারকারী শিক্ষার। ব্যবহারকারীরা যদি সেই অক্ষরগুলিকে সমানভাবে বিবেচনা করতে চান - বিশেষত একটি অনুসন্ধানে - তবে সেই কার্যকারিতাটি স্পষ্টভাবে তৈরি করা দরকার। এটি কোনও কোলেশন ইস্যু নয়।
নিক চ্যামাস

উত্তর:


4

আমি কয়েকটি পরীক্ষা করেছি এবং আমার ধারণা এটি প্রায় কাজ তবে আপনার কাজটি সম্পন্ন করতে পারে, কারণ এসকিউএল এটি নিজে খুব একটা সহায়তা করে না।

যদি আপনি লক্ষ্য করেন যে এই অক্ষরগুলির ইউনিকোডগুলি একে অপরের কাছাকাছি রয়েছে

select unicode(N'أ')
  = 1571

select unicode(N'ا')
  = 1575

select unicode(N'إ')
  = 1573

সুতরাং أ এবং এ এর ​​মধ্যে, এটি 1571 থেকে 1575 পর্যন্ত বা আপনি যদি নিশ্চিত করতে চান যে আপনি প্রতিটি জিনিসই এর মধ্যে পেয়েছেন

আপনি 1569 থেকে 1575 এর মধ্যে অন্তর্ভুক্ত করেছেন তা নিশ্চিত করুন

কোনটি

Select NCHAR(1569) = ء
Select NCHAR(1570) = آ
Select NCHAR(1571) = أ
Select NCHAR(1572) = ؤ
Select NCHAR(1573) = إ
Select NCHAR(1574) = ئ 
Select NCHAR(1575) = ا

সুতরাং আপনার সন্ধানে আপনি অনুরূপ প্রতিটি জিনিস অন্তর্ভুক্ত করেছেন তা নিশ্চিত করার জন্য আপনি নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন

SELECT * 
FROM TestTable 
WHERE ArabicChars like '%[ء-ا]%'

সুতরাং এক্ষেত্রে আপনি ১৯ এবং আ এর মধ্যে সমস্ত অক্ষর পাবেন যা 1569 থেকে 1575 এর মধ্যে রয়েছে include

সুতরাং এই ক্ষেত্রে যদি আপনার টেবিল আছে

 CREATE TABLE [dbo].[TestTable]  (
    [ArabicChars] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,
) 
INSERT INTO TestTable values (N'احمد');
INSERT INTO TestTable values (N'أحمد');
INSERT INTO TestTable values (N'إحمد');

উপরের ক্যোয়ারীটি সেগুলি সবই পাবেন।

তবে আপনি মজার কিছু লক্ষ্য করবেন

যদি আপনার কলামটি প্রাথমিক কী হিসাবে থাকে

CREATE TABLE [dbo].[TestTable]  (
    [ArabicChars] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,

    CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
    (
       [ArabicChars] ASC
    )
) ON [PRIMARY];

আপনি এই 2 টি রেকর্ড সন্নিবেশ করতে সক্ষম হবেন না

INSERT INTO TestTable values (N'أحمد');
INSERT INTO TestTable values (N'إحمد');
INSERT INTO TestTable values (N'ءحمد');

কারণ ১৯, أ, إ সমস্ত এসকিউএল এর হ্যামজার একটি অংশ যা ১৯ ء৯

সুতরাং আপনি যদি ক্যোয়ারী চালান

SELECT * 
FROM TestTable 
WHERE ArabicChars like 'ء%'

এটা আপনাকে দেখাতে হবে

أحمد
إحمد

দীর্ঘ গল্প সংক্ষিপ্ত পেতে তাই

এসকিউএল-এর কাছে = থেকে = নয় = কারণ এটির দুটি পৃথক অক্ষর হামজা এবং আলেফপি

তবে ১৯ = আ = أ = বা = إ = ই

তারা সব হামজা হয় ء


দুর্দান্ত কাজ @ আমারআর
জর্জ

1

এটি আমি সবচেয়ে জটিল সমস্যার মধ্যে দিয়ে গেছি of

সুতরাং আমি আপনাকে যা লিখতে চেষ্টা করেছি তার সব লিখব, সম্ভবত আপনি তার পরে এটি শুরু করতে পারেন

 CREATE TABLE [dbo].[TestTable]  (
    [ArabicChars] [nvarchar](50) COLLATE Arabic_CI_AI NOT NULL,

    CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
    (
       [ArabicChars] ASC
    )
) ON [PRIMARY];

আমি আপনার কলামটি COLLATE আরবি_সিআই_এআই ব্যবহার করে তৈরি করেছি যেখানে সিআই = কেস সংবেদনশীল এবং এআই = অ্যাকসেন্ট সংবেদনশীল এবং এটি এখানে কাজ করার জন্য মনে করা হয় কারণ আপনি যদি এস এবং Š এর মতো অন্য কোনও ভাষা বেছে নেন তবে এটি কাজ করে

আমি আরবি_সিআই_এইতে ডাটাবেস কোলেশনটি পরিবর্তন করার চেষ্টা করেছি এখনও কার্যকর হয়নি

আপনি যেমন স্ক্রিপ্ট কল্ট করতে পারেন

পরীক্ষার টেবিলের থেকে * নির্বাচন করুন যেখানে আরবীচররা আরবি_সিআইএআই'এর মতো ''% 'আরবি_সিআইএআই'র মতো ক্লিক করুন;

এবং এটি এখনও কার্যকর হয়নি

এই নিবন্ধটি পরীক্ষা করে দেখুন এটি একই সমস্যা সম্পর্কে কথা বলছে তবে বাছাই পয়েন্ট থেকে

http://technet.microsoft.com/en-us/library/cc295829(SQL.90).aspx

এটি নিবন্ধ থেকে নেওয়া হয়েছে

উদাহরণস্বরূপ, একটি সাজানোর ক্রমটি আরবি অক্ষর '' এর চেয়ে কম, সমান বা '' এর চেয়ে বড় কিনা তা নির্ধারণ করে। এটি কোলেশন অ্যাকসেন্ট-সংবেদনশীল কিনা উদাহরণস্বরূপ ব্যাখ্যা করে (উদাহরণস্বরূপ, '' সমান বা সমান নয় '')।

এখানে অন্য একজন আছেন যিনি এই সমস্যাটি নিয়ে গবেষণা করেছেন তবে কোনও সমাধান খুঁজে পেতে পারেননি http://www.siao2.com/2008/11/11/11/9056745.aspx

ডায়াক্রিটিক্স বা হামজা উপেক্ষা করার চেষ্টা করছি আমার মনে হয় বর্তমানে স্কিল সার্ভারে এটি সম্ভব নয়

ভবিষ্যতের সংস্করণ হতে পারে


আম্মারআর
জর্জ

0

এই পোস্টে উল্লিখিত উদ্দেশ্যে, আপনি কেবলমাত্র এটি ব্যবহার করতে পারেন: এসকিউএল_ল্যাটিন 1_ জেনারাল_সিপি 1251_ সিআই_এএস [এটি আরবি এবং ফারসি পাশাপাশি ইংরেজি / ল্যাটিন চরিত্রের সেটগুলির জন্যও কাজ করে]।

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