Bazı Arapça karakterlere özdeş davranma


10

Arapçada ا (alef) ve أ (hamza ile alef) gibi karakterlerimiz var.

Kullanıcılar bunları birbirlerinin yerine yazıyor ve birbirlerinin yerine aramak istiyoruz. SQL Server bunları ayrı karakterler olarak kabul eder. SQL'in onlara aynı karakter olarak davranmasını nasıl sağlayabilirim?

Takma sırasında herhangi bir أ (alef ile hamza) yerine ا (alef) yerine düşündüm, ancak Arapça dilinde sadece ا (alef) ve أ (hamza ile alef) değil, birçok alternatifimiz var.

Denedim Arabic_CI_ASve Arabic_CI_AIancak bu sorunu çözmez.

İşte sorunu yeniden oluşturmak için bir komut dosyası:

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'ا%';

Sonuç:

ArabicChars 

احمد

(1 row(s) affected)

İstenen sonuç, eklediğimiz satırların her ikisi olacaktır.


Sorun değil. Aaron Bertrand, olası tüm harmanlamaları test etmek için uyarlayabileceğiniz güzel bir senaryoya sahiptir. Ancak, hiçbir harmanlamanın bu iki karakteri aynı şekilde değerlendirmeyeceğinden şüpheleniyorum.
Nick Chammas

ancak belirtilen adlarda iki farklı karaktere sahipsiniz, en azından görünüşte. Ve elbette, farklı karakter olarak muamele görmeleri gerektiğini düşünüyorumا and أ
nuux

3
@NickChammas tahmin ettiğiniz gibi SOUNDEX () herhangi bir Arapça karakter için 0000 döndürür
George Botros

1
@NickChammas: sorun o zaman: kullanıcı davranışı + varsayım katı harmanlama davranışından farklıdır.
Mart'ta gbn

1
@gbn - Bunların farklı harfler olduğu düşünüldüğünde, sorunun kullanıcı eğitimi olduğunu söyleyebilirim. Kullanıcılar bu harflere eşit olarak davranılmasını istiyorsa - özellikle bir aramada - bu işlevin açıkça oluşturulması gerekir. Bu bir harmanlama sorunu değildir.
Nick Chammas

Yanıtlar:


4

birkaç test yaptım ve sanırım bu bir iştir ama işinizi halledebilir, çünkü SQL çok fazla yardımcı olmuyor.

bu karakterlerin tek noktalarının birbirine yakın olduğunu fark ederseniz

select unicode(N'أ')
  = 1571

select unicode(N'ا')
  = 1575

select unicode(N'إ')
  = 1573

Yani أ ve ا arasında, 1571'den 1575'e veya aradaki her şeyi aldığınızdan emin olmak istiyorsanız

1569'dan 1575'e dahil ettiğinizden emin olun

hangileri

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

Aramanıza benzer her şeyi eklediğinizden emin olmak için düzenli ifadeler kullanabilirsiniz

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

yani bu durumda, 1569 ile 1575 arasındaki tüm karakterleri içeren ء ve ا arasındaki tüm karakterleri alırsınız

yani bu durumda tablonuz varsa

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

yukarıdaki sorgu hepsini alacaktır.

ama komik bir şey fark edeceksin

sütunu birincil anahtar olarak aldıysanız

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

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

bu 2 kaydı ekleyemezsiniz

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

çünkü ء, أ, إ hepsi SQL içindir hamza bir parçasıdır are

Yani sorguyu çalıştırırsanız

SELECT * 
FROM TestTable 
WHERE ArabicChars like 'ء%'

sana gösterecek

أحمد
إحمد

uzun hikayeyi kısaltmak için

to SQL أ = = ا değil çünkü 2 farklı harfi hamza ve alefp

ama ء = آ = أ = ؤ = إ = ئ

hepsi Hamza ء


Büyük iş @AmmarR
George Botros

1

bu yaşadığım en karmaşık konulardan biri

böylece işe yaramadı denedim her şeyi yazacağım, belki bundan sonra başlayabilirsiniz

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

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

CI = büyük / küçük harf duyarsız ve AI = aksan duyarlı olmayan COLLATE Arabic_CI_AI kullanarak sütununuzu yarattım ve bu, örneğin S ve Š gibi başka bir dil seçtiyseniz çalışır

Ayrıca Arabic_CI_AI veritabanı harmanlamayı değiştirmeyi denedim hala işe yaramadı

ayrıca betiği şu şekilde harmanlayabilirsiniz:

SEÇ * TestTable'DAN NEREDE ArapçaChars Arabic_CI_AI 'ا%' gibi COLLATE Arabic_CI_AI;

ve hala işe yaramadı

aynı konu hakkında ama sıralama noktasından bahsettiği bu makaleye göz atın

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

bu makaleden alınmıştır

Örneğin, bir sıralama düzeni, Arapça karakterin '' küçük, eşit veya daha büyük olduğunu tanımlar. Ayrıca harmanlamanın aksan duyarlı olup olmadığını da tanımlar (örneğin, '' eşit veya eşit değil '').

İşte bu sorunu araştıran ancak herhangi bir çözüm bulamayan başka bir kişi http://www.siao2.com/2008/11/11/9056745.aspx

diacritics veya hamza görmezden çalışıyor sanırım şu anda sql sunucusunda mümkün değil

gelecekteki sürümler olabilir


İyi Çalışma @AmmarR
George

0

Bu yayında belirtilen amaç için yalnızca şunu kullanabilirsiniz: SQL_Latin1_General_CP1251_CI_AS [Arapça ve Farsça ile İngilizce / Latin karakter kümeleri için çalışır].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.