अरबी के कुछ वर्णों को समान मानना


10

अरबी में हमारे पास ا (alef) और أ (alef with hamza) जैसे पात्र हैं।

उपयोगकर्ता उन्हें विनिमेय रूप से लिखते हैं और हम उन्हें परस्पर विनिमय से खोजना चाहते हैं। SQL सर्वर उन्हें अलग वर्णों के रूप में मानता है। मैं एसक्यूएल उन्हें एक ही चरित्र के रूप में कैसे बना सकता हूं?

मैंने सम्मिलन में किसी भी أ (alef with hamza) को ا (alef) के साथ बदलने के बारे में सोचा लेकिन हमारे पास अरबी भाषा में बहुत सारे विकल्प हैं न केवल ا (alef) और أ (alef with hamza)।

मैंने कोशिश की 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)

वांछित परिणाम हमारे द्वारा डाली गई दोनों पंक्तियों का होगा।


कोई दिक्कत नहीं है। हारून बर्ट्रेंड की एक छोटी सी स्क्रिप्ट है जिसे आप सभी संभावित टकरावों का परीक्षण करने के लिए अनुकूलित कर सकते हैं। हालांकि, मुझे संदेह है कि कोई भी टकराव उन दो पात्रों पर समान विचार नहीं करेगा।
निक चम्मास

लेकिन आपको बताए गए नामों में दो अलग-अलग वर्ण हैं, जो दिखने में कम से कम हैं। और हां, मुझे लगता है कि उन्हें अलग-अलग वर्णों के रूप में माना जाना चाहिएا and أ
nuux

3
@NickChammas जैसा कि आपने SOUNDEX () किसी भी अरबी चरित्र के लिए 0000
लौटाया

1
@NickChammas: जो तब समस्या है: उपयोगकर्ता व्यवहार + धारणा सख्त टकराव के व्यवहार से अलग है।
gbn

1
@ जीबी - यह देखते हुए कि ये अलग-अलग पत्र हैं, मैं कहूंगा कि मुद्दा उपयोगकर्ता शिक्षा है। यदि उपयोगकर्ता चाहते हैं कि उन पत्रों को समान रूप से व्यवहार किया जाए - विशेष रूप से एक खोज में - तो उस कार्यक्षमता को स्पष्ट रूप से निर्मित करने की आवश्यकता है। यह टकराव का मुद्दा नहीं है।
निक चम्मास

जवाबों:


4

मैंने कुछ परीक्षण किए और मुझे लगता है कि यह चारों ओर का काम है, लेकिन अपना काम पूरा कर सकते हैं, क्योंकि एसक्यूएल स्वयं बहुत मदद नहीं कर रहा है।

यदि आप ध्यान दें कि इन वर्णों के यूनिकोड एक दूसरे के करीब हैं

select unicode(N'أ')
  = 1571

select unicode(N'ا')
  = 1575

select unicode(N'إ')
  = 1573

इसलिए to और के बीच, 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 '%[ء-ا]%'

तो इस मामले में आपको between और ا के बीच सभी वर्ण मिलते हैं, जिसमें 1569 से 1575 के बीच सभी शामिल हैं

तो इस मामले में अगर आपकी मेज है

 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'ءحمد');

क्योंकि to, أ, ء सभी SQL के लिए हैं, जो हम्ज़ा का हिस्सा है, जो ء है

तो अगर आप क्वेरी चलाते हैं

SELECT * 
FROM TestTable 
WHERE ArabicChars like 'ء%'

यह आपको दिखाएगा

أحمد
إحمد

इतनी लंबी कहानी छोटी पाने के लिए

to SQL different = = to नहीं है क्योंकि इसके 2 अलग-अलग अक्षर हैजा और एलेफप हैं

लेकिन but = ء = أ = ء = ئ = آ = آ

वे सभी हमजा ء हैं


महान काम @AmmarR
जॉर्ज बॉट्रो

1

यह उन सबसे जटिल मुद्दों में से एक है जिनसे मैं गुज़रा हूँ

इसलिए मैं आप सभी को लिखूंगा कि मैंने क्या काम नहीं किया, हो सकता है कि आप उसके बाद शुरू कर सकें

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

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

मैंने COLLATE Arabic_CI_AI का उपयोग करके अपना कॉलम बनाया, जहां CI = केस असंवेदनशील और AI = उच्चारण असंवेदनशील, और यह वह जगह है जहाँ काम करने के लिए इसका अर्थ है क्योंकि यदि आपने उदाहरण S और Š के लिए दूसरी भाषा को चुना है, तो यह काम करता है

मैंने भी डेटाबेस को बदलने की कोशिश की, लेकिन अभी भी काम नहीं किया

तुम भी स्क्रिप्ट की तरह टकराने कर सकते हैं

चयन करें * से परीक्षण योग्य है, जहां अरबी भाषाएं अरबी भाषा के 'COL_ATE____ की तरह' COLLATE अरबी_CI_AI;

और यह अभी भी काम नहीं किया

इस लेख की जाँच करें यह उसी मुद्दे के बारे में बोलता है लेकिन छँटाई के बिंदु से

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

यह लेख से लिया गया है

उदाहरण के लिए, एक प्रकार का क्रम परिभाषित करता है कि क्या अरबी वर्ण '' से कम, के बराबर या 'से अधिक है। यह यह भी परिभाषित करता है कि क्या टकराव उच्चारण-संवेदनशील है (उदाहरण के लिए, चाहे '' बराबर है या '' के बराबर नहीं है)।

यहाँ एक और व्यक्ति है जिसने इस समस्या पर शोध किया है लेकिन कोई समाधान नहीं ढूंढ सका है http://www.siao2.com/2008/11/11/9056745.aspx

वर्तमान में एसक्यूएल सर्वर में संभव नहीं है कि मैं डायटिटिक्स या हम्ज़ा की उपेक्षा करने की कोशिश कर रहा हूं

भविष्य के संस्करण हो सकते हैं


गुड वर्क @AmmarR
जॉर्ज बॉट्रो

0

इस पोस्ट में बताए गए उद्देश्य के लिए, आप केवल उपयोग कर सकते हैं: SQL_Latin1_General_CP1251_CI_AS [यह अरबी और फारसी के साथ-साथ अंग्रेजी / लैटिन वर्ण सेटों के लिए भी काम करता है]।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.