W języku arabskim mamy znaki takie jak ا (alef) i أ (alef with hamza).
Użytkownicy piszą je zamiennie, a my chcemy je wyszukiwać zamiennie. SQL Server traktuje je jako osobne znaki. Jak zmusić SQL do traktowania ich jako tego samego znaku?
Pomyślałem, że przy wstawianiu mogę zastąpić dowolne أ (alef z hamza) przez ا (alef), ale mamy wiele alternatyw w języku arabskim, nie tylko ا (alef) i أ (alef z hamza).
Próbowałem Arabic_CI_AS
i Arabic_CI_AI
ale to nie rozwiązuje problemu.
Oto skrypt do ponownego wygenerowania problemu:
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'ا%';
Wynik to:
ArabicChars
احمد
(1 row(s) affected)
Pożądanym rezultatem byłyby oba wstawione wiersze.
sql-server
collation
George Botros
źródło
źródło
ا and أ
Odpowiedzi:
Zrobiłem kilka testów i myślę, że to jest obejście, ale może zrobić swoją pracę, ponieważ SQL sam w sobie nie pomaga.
jeśli zauważysz, że Unicode tych znaków są blisko siebie
więc między أ i ا, to od 1571 do 1575 lub jeśli chcesz mieć pewność, że dostaniesz wszystko pomiędzy
upewnij się, że podałeś od 1569 do 1575
które są
Aby upewnić się, że w wyszukiwaniu uwzględnisz wszystkie podobne elementy, możesz użyć wyrażeń regularnych
więc w tym przypadku otrzymujesz wszystkie znaki od ء do ا, które obejmują wszystkie między 1569 a 1575
więc w tym przypadku, jeśli Twój stół ma
powyższe zapytanie otrzyma je wszystkie.
ale zauważysz coś śmiesznego
jeśli masz kolumnę jako klucz podstawowy
nie będzie można wstawić tych 2 rekordów
ponieważ wszystkie ء, أ, إ są SQL, są częścią hamza, która jest ء
Więc jeśli uruchomisz zapytanie
pokaże ci
więc krótko mówiąc
na SQL أ nie jest = na ا, ponieważ ma 2 różne litery hamza i alefp
ale ء = آ = أ = ؤ = إ = ئ
wszyscy oni są Hamza ء
źródło
jest to jeden z najbardziej skomplikowanych problemów, przez które przeszedłem
więc napiszę wam wszystko, co próbowałem, ale nie zadziałało, być może możecie zacząć od tego
utworzyłem twoją kolumnę przy użyciu COLLATE Arabic_CI_AI, gdzie CI = bez rozróżniania wielkości liter i AI = bez uwzględniania akcentu, i tam powinien działać, ponieważ jeśli wybierzesz inny język, na przykład S i Š, to działa
Próbowałem także zmienić sortowanie bazy danych na Arabic_CI_AI nadal nie działało
możesz także zestawić skrypt jak
WYBIERZ * Z TABELI Testowej GDZIE ArabicChars COLLATE Arabic_CI_AI jak 'ا%' COLLATE Arabic_CI_AI;
i nadal nie działało
sprawdź ten artykuł mówi o tym samym problemie, ale od punktu sortowania
http://technet.microsoft.com/en-us/library/cc295829(SQL.90).aspx
pochodzi z tego artykułu
oto inna osoba, która badała ten problem, ale nie mogła znaleźć żadnego rozwiązania http://www.siao2.com/2008/11/11/9056745.aspx
próbuje zignorować znaki diakrytyczne lub hamza i chyba nie jest możliwe na serwerze SQL
mogą być przyszłe wersje
źródło
Do celów wymienionych w tym poście możesz używać tylko: SQL_Latin1_General_CP1251_CI_AS [działa w przypadku zestawów znaków arabskich i perskich oraz angielskich / łacińskich].
źródło