Эта проблема может быть решена с использованием сортировки без учета акцента .
Ваша база данных, вероятно, использует сопоставление 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
.
CREATE TABLE testaccent (name nvarchar(50));
GO
INSERT INTO testaccent (name) VALUES ('Millière') , ('Milliere');
GO
-- returns Miliere
SELECT * FROM testaccent WHERE name = 'Milliere';
-- returns both
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AI
--only returns Miliere
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AS
Прочтите Использование SQL Server Collation для получения дополнительной информации.
С другой стороны, вы, вероятно, захотите, чтобы сортировка использовала это сопоставление (как peufeu отметил в комментариях), чтобы гарантировать, что "é" сортирует с "e". В противном случае тот, кто разбивает результаты на страницы в алфавитном порядке, будет удивлен, если не найдет «é» там, где они ожидают его, но если вы хотите только коснуться этого запроса, вы можете добавить к нему и COLLATE
предложение ORDER BY
.
Как отметил Соломон Руцки в комментариях, если это затрагивает только один или несколько столбцов, другой вариант - создать непостоянный вычисляемый столбец, который просто повторяет столбец «name» и обеспечивает сортировку без учета акцента, а затем индексировать вычисленный колонка. Это позволяет избежать сканирования, вызванного изменением параметров сортировки в запросе. Затем запрос необходимо отфильтровать по новому столбцу.
Что-то вроде:
ALTER TABLE
dbo.[table_name] ADD [SearchName] datatype_of_name_column
AS ([Name] COLLATE LATIN1_GENERAL_100_CI_AI));
CREATE INDEX [IX_table_name_SearchName]
ON dbo.[table_name] ([SearchName] ASC);
Или вы можете также создать представление вместо добавления вычисляемого столбца (как предпочитает jyao ).