J'ai un site Web qui a des noms de produits contenant des mots français et anglais. Lorsque je stocke un nom de produit, je le stocke au format html encodé dans le champ ProductName de mon serveur SQL. Par exemple, le mot Château est stocké en tant que Ch& #226;teau dans ma base de données.

Si quelqu'un veut rechercher un nom de produit, j'encode le terme de recherche en HTML. Cela renverra avec succès une correspondance pour le terme de recherche Château, mais si quelqu'un tape Chateau (ce que la plupart des utilisateurs anglais feraient), je ne reçois aucun résultat de ma déclaration LIKE. C'est correct car Château ne correspond pas à Château.

Ce que j'aimerais pouvoir faire, c'est laisser quelqu'un rechercher quelque chose comme le mot Château en tapant simplement Château.

Des idées comment je pourrais m'y prendre? J'utilise asp.net C# 3.5 SP1 et Sql Server 05.

2
Richard Reddy 24 nov. 2009 à 13:53
Que diriez-vous d'afficher des mots phonétiques similaires correspondant, si aucun résultat n'est trouvé ou en plus des résultats ?
 – 
Saar
24 nov. 2009 à 14:03
Ce serait plutôt cool, mais tous les exemples que j'ai examinés sont extrêmement compliqués pour cette solution. Je dirais que je devrai probablement simplement enregistrer les noms de produits sans les coder en HTML, puis utiliser le casting de classement selon les exemples ci-dessous.
 – 
Richard Reddy
24 nov. 2009 à 14:13

2 réponses

Meilleure réponse
select 
    product_name 
from 
    products 
where 
    product_name Collate SQL_Latin1_General_CP1_CI_AI like 'Chateau'
1
Darin Dimitrov 24 nov. 2009 à 14:04
Merci pour votre réponse, mais les valeurs sont stockées au format HTML codé. J'ai mis à jour ma réponse pour que cela soit plus clair - l'éditeur du site a converti ma valeur en html ;) Me recommanderiez-vous de stocker le libellé français sans l'encoder dans ma base de données ? Merci.
 – 
Richard Reddy
24 nov. 2009 à 14:08
Oui, stockez-le directement avec des accents dans la base de données. Ne stockez jamais d'entités encodées HTML dans la base de données.
 – 
Darin Dimitrov
24 nov. 2009 à 14:21

Une réponse simple consiste à utiliser le casting de classement ; dans votre cas, utilisez des classements "insensibles aux accents", par exemple :

SELECT *
FROM table
WHERE ProductName COLLATE SQL_Latin1_General_Cp1_CI_AI LIKE 'Chateau' COLLATE SQL_Latin1_General_Cp1_CI_AI;

Vérifiez vos classements et ajustez-les si nécessaire (notez la fin "_AI" qui signifie "insensible aux accents").

Une option plus avancée serait d'utiliser la Recherche en texte intégral. Faites-nous savoir si vous avez besoin d'aide pour cela.

0
Codesleuth 24 nov. 2009 à 14:01