Bestimmte arabische Zeichen als identisch behandeln


10

Auf Arabisch haben wir Zeichen wie ا (Alef) und أ (Alef mit Hamza).

Benutzer schreiben sie austauschbar und wir möchten sie austauschbar suchen. SQL Server behandelt sie als separate Zeichen. Wie kann ich SQL veranlassen, sie als dasselbe Zeichen zu behandeln?

Ich dachte, beim Einfügen jedes أ (Alef mit Hamza) durch ا (Alef) zu ersetzen, aber wir haben viele Alternativen in arabischer Sprache, nicht nur ا (Alef) und أ (Alef mit Hamza).

Ich habe es versucht Arabic_CI_ASund Arabic_CI_AIaber das löst das Problem nicht.

Hier ist ein Skript, um das Problem neu zu generieren:

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

Das Ergebnis ist:

ArabicChars 

احمد

(1 row(s) affected)

Das gewünschte Ergebnis wären beide Zeilen, die wir eingefügt haben.


Kein Problem. Aaron Bertrand hat ein nettes kleines Skript , das Sie anpassen können, um alle möglichen Kollatierungen zu testen. Ich vermute jedoch, dass keine Sortierung diese beiden Zeichen als gleich betrachtet.
Nick Chammas

Aber Sie haben zwei verschiedene Zeichen in den angegebenen Namen, zumindest im Aussehen. Und natürlich denke ich, dass sie als verschiedene Zeichen behandelt werden solltenا and أ
nuux

3
@ NickChammas, wie Sie vermutet haben, SOUNDEX () geben 0000 für jedes arabische Zeichen zurück
George Botros

1
@NickChammas: Das ist dann das Problem: Benutzerverhalten + Annahme unterscheidet sich vom strengeren Sortierverhalten.
gbn

1
@gbn - Da es sich um unterschiedliche Buchstaben handelt, würde ich sagen, dass das Problem die Benutzererziehung ist. Wenn Benutzer möchten, dass diese Buchstaben - insbesondere bei einer Suche - gleich behandelt werden, muss diese Funktionalität explizit erstellt werden. Es ist kein Kollatierungsproblem.
Nick Chammas

Antworten:


4

Ich habe nur wenige Tests durchgeführt und ich denke, es ist eine Problemumgehung, aber ich kann Ihre Arbeit erledigen, da SQL selbst nicht viel hilft.

wenn Sie feststellen, dass die Unicodes dieser Zeichen nahe beieinander liegen

select unicode(N'أ')
  = 1571

select unicode(N'ا')
  = 1575

select unicode(N'إ')
  = 1573

Also zwischen أ und ا ist es von 1571 bis 1575 oder wenn Sie sicherstellen möchten, dass Sie alles dazwischen bekommen

Stellen Sie sicher, dass Sie zwischen 1569 und 1575 angeben

welche sind

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

Um sicherzustellen, dass Sie alle ähnlichen Elemente in Ihre Suche einbeziehen, können Sie reguläre Ausdrücke verwenden

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

In diesem Fall erhalten Sie alle Zeichen zwischen ء und ا, einschließlich aller Zeichen zwischen 1569 und 1575

Also in diesem Fall, wenn Ihr Tisch hat

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

Die obige Abfrage wird sie alle erhalten.

aber du wirst etwas lustiges bemerken

wenn Sie Ihre Spalte als Primärschlüssel haben

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

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

Sie können diese 2 Datensätze nicht einfügen

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

weil die ء, أ, إ alle zu SQL gehören, sind sie Teil von hamza, was ء ist

Also, wenn Sie die Abfrage ausführen

SELECT * 
FROM TestTable 
WHERE ArabicChars like 'ء%'

es wird dir zeigen

أحمد
إحمد

um es kurz zu machen

zu SQL أ ist nicht = zu ا, weil seine 2 verschiedenen Buchstaben hamza und alefp

aber ء = آ = أ = ؤ = إ = ئ

sie sind alle Hamza ء


Großartige Arbeit @AmmarR
George Botros

1

Dies ist eines der kompliziertesten Probleme, die ich durchlaufen habe

Also werde ich dir alles schreiben, was ich versucht habe, was nicht funktioniert hat. Vielleicht kannst du danach anfangen

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

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

Ich habe Ihre Spalte mit COLLATE Arabic_CI_AI erstellt, wobei CI = Groß- und Kleinschreibung nicht berücksichtigen und AI = Akzent nicht berücksichtigen

Ich habe auch versucht, die Datenbankkollatierung in Arabic_CI_AI zu ändern, was immer noch nicht funktioniert hat

Sie können das Skript auch wie sortieren

SELECT * FROM TestTable WHERE ArabicChars COLLATE Arabic_CI_AI wie 'ا%' COLLATE Arabic_CI_AI;

und es hat immer noch nicht funktioniert

In diesem Artikel geht es um dasselbe Problem, jedoch vom Sortierpunkt aus

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

Dies ist aus dem Artikel entnommen

Beispielsweise sortiert eine Sortierreihenfolge, ob das arabische Zeichen '' kleiner, gleich oder größer als '' ist. Außerdem wird definiert, ob die Sortierung akzentempfindlich ist (z. B. ob '' gleich oder nicht gleich '' ist).

Hier ist eine andere Person, die dieses Problem untersucht hat, aber keine Lösung finden konnte. http://www.siao2.com/2008/11/11/9056745.aspx

Der Versuch, Diakritika oder Hamza zu ignorieren, ist derzeit auf SQL Server nicht möglich

kann zukünftige Versionen sein


Gute Arbeit @AmmarR
George Botros

0

Für den in diesem Beitrag genannten Zweck dürfen Sie nur Folgendes verwenden: SQL_Latin1_General_CP1251_CI_AS [funktioniert für arabische und persische sowie englische / lateinische Zeichensätze].

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.