W naszej bazie danych mamy wiele wpisów z caron / hatschek. Teraz nasi użytkownicy chcą znaleźć wpisy, w tym caron / hatschek, gdy szukają wpisów bez. Pokażę to na prostym przykładzie:
W naszej bazie danych mamy wpis (kontakt z imieniem)
Millière
więc ta nazwa jest poprawna w kraju, w którym mieszka osoba.
W naszym kraju nie mamy żadnych znaków z caron / hatschek, dlatego nasz użytkownik szuka Milliere
. Nie pojawiają się żadne wyniki, ponieważ è
oczywiście nie pasują e
.
Nie mam pojęcia, jak to może być realizowane jako é
, è
, ê
i wiele innych dostępne są (i to tylko przykład na literę e
...).
(Drugi sposób byłby znacznie łatwiejszy, ponieważ mogłem po prostu zastąpić wszystkie litery caron / hatschek podstawową. Oczywiście, nasi użytkownicy chcą poprawnej wersji nazwy w bazie danych, a nie kalekiej).
Odpowiedzi:
Ten problem można rozwiązać za pomocą sortowania niewrażliwego na akcenty .
Twoja baza danych prawdopodobnie używa sortowania AS (Accent Sensitive), więc domyślnie będzie wyszukiwać dokładne dopasowanie z uwzględnieniem akcentów.
Możesz poinstruować klauzulę WHERE, aby używała innego sortowania niż domyślna baza danych, określając sortowanie z porównaniem.
W tym pliku dbfiddle stworzyłem przykład przy użyciu zestawień LATIN1, ale możesz zastosować to samo podejście z zestawieniem, którego używasz, po prostu zmieniając AS w AI dla zestawienia, którego obecnie używa kolumna.
Użyj sortowania niewrażliwego na akcent, który pasuje do zestawienia używanego przez kolumnę. Na przykład, jeśli kolumna korzysta
SQL_Latin1_General_CP1_CI_AS
, używaniaSQL_Latin1_General_CP1_CI_AI
i nieLatin1_General_CI_AS
lubLatin1_General_100_CI_AS
czy którykolwiek z tych dwóch wariantów od czasu zachowania się sortowania non-SQL_ będą różnić się na więcej sposobów niż tylko akcent niewrażliwości, i że nie można oczekiwać od użytkowników.Możesz sprawdzić bieżące sortowanie w
sys.columns
.Przeczytaj, używając SQL Server Collations, aby uzyskać więcej informacji.
Z drugiej strony prawdopodobnie chciałbyś, aby sortowanie używało tego sortowania (jak zauważył peufeu w komentarzach), aby mieć pewność, że „é” będzie sortowane za pomocą „e”. W przeciwnym razie ktoś, kto paginuje wyniki w kolejności alfabetycznej, byłby zaskoczony, gdyby nie znalazł „é” tam, gdzie się spodziewa, ale jeśli chcesz tylko dotknąć tego zapytania, możesz również dodać
COLLATE
klauzulęORDER BY
.Jak zauważył Solomon Rutzky w komentarzach, jeśli dotyczy to tylko jednej lub kilku kolumn, inną opcją jest utworzenie nietrwałej kolumny obliczeniowej, która po prostu powtarza kolumnę „nazwa” i zapewnia sortowanie niewrażliwe na akcent, a następnie indeksuje obliczoną kolumna. Pozwala to uniknąć skanowania spowodowanego zmianą sortowania w zapytaniu. Następnie zapytanie musi zostać przefiltrowane według nowej kolumny.
Coś jak:
Możesz też utworzyć widok zamiast dodawać kolumnę obliczeniową (tak jak preferuje jyao ).
źródło
SQL_Latin1_General_CP1_CI_AS
, użyjSQL_Latin1_General_CP1_CI_AI
i nie,Latin1_General_CI_AS
lubLatin1_General_100_CI_AS
dowolna odmiana tych dwóch, ponieważ zachowanie brakuSQL_
sortowania będzie się różnić na więcej sposobów niż tylko niewrażliwość na akcent, a użytkownicy nie mogą się tego spodziewać. Sortowanie znajduje się wsys.columns
.