В нашей базе данных есть несколько записей с caron / hatschek. Теперь наши пользователи хотят найти записи, включая caron / hatschek, когда они ищут записи без. Я покажу это на простом примере:
В нашей базе данных есть запись (контакт с именем)
Millière
так что это имя правильно в стране, в которой человек живет.
В нашей стране у нас нет символов с caron / hatschek, поэтому наш пользователь ищет Milliere
. Никаких результатов не получается, так как è
явно не совпадает e
.
Я понятия не имею , как это может быть реализовано , как é
, è
, ê
и многое другое доступны (и это только пример для письма e
...).
(Другой способ был бы намного проще, поскольку я мог бы просто заменить все буквы на caron / hatschek на базовые. Очевидно, что наши пользователи хотят иметь правильную версию имени в базе данных, а не поврежденную.)
Ответы:
Эта проблема может быть решена с использованием сортировки без учета акцента .
Ваша база данных, вероятно, использует сопоставление AS (Accent Sensitive), поэтому по умолчанию она будет искать точное совпадение, включая акценты.
Вы можете указать предложению WHERE использовать другое сопоставление, отличное от значения по умолчанию для базы данных, указав сопоставление со сравнением.
В этом dbfiddle я создал пример с использованием параметров сортировки LATIN1, но вы можете использовать тот же подход, что и при использовании параметров сортировки, просто изменив AS на AI для параметров сортировки, используемых в данный момент вашим столбцом.
Используйте сопоставление нечувствительного к акценту, совпадающее с тем, которое использует столбец. Например, если столбец использует
SQL_Latin1_General_CP1_CI_AS
, используетSQL_Latin1_General_CP1_CI_AI
и не используетLatin1_General_CI_AS
или не используетLatin1_General_100_CI_AS
любые из этих двух вариантов, так как поведение сопоставлений, отличных от SQL_, будет отличаться в большей степени, чем просто нечувствительность к акценту, и пользователи могут этого не ожидать.Вы можете проверить текущую сортировку в
sys.columns
.Прочтите Использование SQL Server Collation для получения дополнительной информации.
С другой стороны, вы, вероятно, захотите, чтобы сортировка использовала это сопоставление (как peufeu отметил в комментариях), чтобы гарантировать, что "é" сортирует с "e". В противном случае тот, кто разбивает результаты на страницы в алфавитном порядке, будет удивлен, если не найдет «é» там, где они ожидают его, но если вы хотите только коснуться этого запроса, вы можете добавить к нему и
COLLATE
предложениеORDER BY
.Как отметил Соломон Руцки в комментариях, если это затрагивает только один или несколько столбцов, другой вариант - создать непостоянный вычисляемый столбец, который просто повторяет столбец «name» и обеспечивает сортировку без учета акцента, а затем индексировать вычисленный колонка. Это позволяет избежать сканирования, вызванного изменением параметров сортировки в запросе. Затем запрос необходимо отфильтровать по новому столбцу.
Что-то вроде:
Или вы можете также создать представление вместо добавления вычисляемого столбца (как предпочитает jyao ).
источник
SQL_Latin1_General_CP1_CI_AS
, использованиеSQL_Latin1_General_CP1_CI_AI
и неLatin1_General_CI_AS
илиLatin1_General_100_CI_AS
или любой из вариантов этих двух с момента поведения непредставленныхSQL_
сортировки будет отличаться большим количеством способов , чем просто акцентом-нечувствительность, и что не может ожидать от пользователей. Сопоставление найдено вsys.columns
.