Ce problème peut être résolu en utilisant des classements insensibles aux accents .
Votre base de données utilise probablement un classement AS (sensible aux accents). Par défaut, il recherchera la correspondance exacte, y compris les accents.
Vous pouvez demander à la clause WHERE d'utiliser un classement différent de celui par défaut de la base de données en spécifiant un classement avec la comparaison.
Dans ce dbfiddle, j'ai créé un exemple en utilisant les classements LATIN1, mais vous pouvez utiliser la même approche avec le classement que vous utilisez en changeant simplement AS en AI pour le classement que votre colonne utilise actuellement.
Utilisez le classement Accent Insensitive qui correspond au classement utilisé par la colonne. Par exemple, si la colonne utilise SQL_Latin1_General_CP1_CI_AS
, utilise SQL_Latin1_General_CP1_CI_AI
et non Latin1_General_CI_AS
ou l'une Latin1_General_100_CI_AS
ou l'autre des variantes de ces deux, car le comportement des classements non-SQL_ différera de bien des façons plus que la simple insensibilité à l'accent, et cela pourrait ne pas être attendu par les utilisateurs.
Vous pouvez archiver le classement actuel 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
Lisez la section Utilisation des classements SQL Server pour plus d'informations.
Là encore, vous voudrez probablement que le tri utilise ce classement (comme peufeu l'a noté dans les commentaires) pour s'assurer que "é" trie avec "e". Sinon, quelqu'un qui pagine dans les résultats par ordre alphabétique serait surpris de ne pas trouver le "é" où il s'attend à ce qu'ils soient, mais si vous voulez seulement toucher cette requête, vous pouvez également ajouter la COLLATE
clause ORDER BY
.
Comme l'a noté Solomon Rutzky dans les commentaires, si cela n'affecte qu'une ou plusieurs colonnes, une autre option consiste à créer une colonne calculée non persistante qui répète simplement la colonne "nom" et fournit le classement insensible à l'accent, puis indexe le calcul colonne. Cela évite l'analyse provoquée par la modification du classement dans la requête. Ensuite, la requête doit filtrer sur la nouvelle colonne.
Quelque chose comme:
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);
Ou vous pouvez également créer une vue au lieu d'ajouter une colonne calculée (comme préfère jyao ).