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_AS
und Arabic_CI_AI
aber 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.
sql-server
collation
George Botros
quelle
quelle
ا and أ
Antworten:
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
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
Um sicherzustellen, dass Sie alle ähnlichen Elemente in Ihre Suche einbeziehen, können Sie reguläre Ausdrücke verwenden
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
Die obige Abfrage wird sie alle erhalten.
aber du wirst etwas lustiges bemerken
wenn Sie Ihre Spalte als Primärschlüssel haben
Sie können diese 2 Datensätze nicht einfügen
weil die ء, أ, إ alle zu SQL gehören, sind sie Teil von hamza, was ء ist
Also, wenn Sie die Abfrage ausführen
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 ء
quelle
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
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
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
quelle
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].
quelle