Цю проблему можна вирішити за допомогою акцентування нечутливих зіставлень .
Ваша база даних, ймовірно, використовує порівняння AS (Accent Sensitive), тому за замовчуванням вона шукатиме точну відповідність, включаючи акценти.
Ви можете доручити пункт WHERE використовувати інше порівняння, ніж за замовчуванням у базі даних, вказавши порівняння для порівняння.
У цьому dbfiddle я створив приклад, використовуючи зібрання LATIN1, але ви можете використати той самий підхід до порівняння, яке ви використовуєте, просто змінивши AS в AI для порівняння, яке використовує ваш стовпець.
Використовуйте підставку Accent Insensitive, яка відповідає порівнянню, яку використовує Colummn. Наприклад, якщо стовпець використовує 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 .
Потім ви, мабуть, хочете сортувати, щоб використовувати це порівняння (як зауважив peufeu в коментарях), щоб "é" сортувало з "e". В іншому випадку хтось, хто пагінізує результати в алфавітному порядку, буде здивований, що не знайде "é" там, де вони їх очікують, але якщо ви хочете лише торкнутися цього запиту, ви також можете додати цю COLLATE
пропозицію ORDER BY
.
Як зазначає Соломон Руцький у коментарях, якщо це стосується лише 1 або декількох стовпців, інший варіант - створити непостійний обчислюваний стовпець, який просто повторює стовпчик "ім'я" та забезпечує порівняння нечутливого зіставлення, а потім індексує обчислені стовпчик. Це дозволяє уникнути сканування, викликаного зміною зіставлення в запиті. Тоді запит потрібно відфільтрувати у новому стовпці.
Щось на зразок:
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 ).