SQL : tenir compte des accents mais pas de la casse
mat8883
Messages postés
41
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
J'ai une base de donnée avec plusieurs dizaines de milliers de mots (dico), mais plusieurs mots ont donc pour seule différence leurs accents (ex: a et à).
Pour le moment si je fais une requête, cela ne prend ni en compte les accents ni la casse :
J'aimerais que si je recherche 'a' ou 'A' cela ne m'affiche que 'a' et non 'à'.
Donc en conclusion je cherche le moyen de pouvoir rendre mes recherches sensibles aux accents mais toujours pas à la casse.
Merci beaucoup de votre aide !
J'ai une base de donnée avec plusieurs dizaines de milliers de mots (dico), mais plusieurs mots ont donc pour seule différence leurs accents (ex: a et à).
Pour le moment si je fais une requête, cela ne prend ni en compte les accents ni la casse :
SELECT * FROM lexique WHERE ortho LIKE '$mot' ORDER BY freq DESC
J'aimerais que si je recherche 'a' ou 'A' cela ne m'affiche que 'a' et non 'à'.
Donc en conclusion je cherche le moyen de pouvoir rendre mes recherches sensibles aux accents mais toujours pas à la casse.
Merci beaucoup de votre aide !
A voir également:
- SQL : tenir compte des accents mais pas de la casse
- Logiciel sql - Télécharger - Bases de données
- Requete sql pix - Forum PHP
- Additions et multiplication dans des requêtes SQL ✓ - Forum MySQL
- Sql query download - Télécharger - Gestion de données
- Ora-00933: la commande sql ne se termine pas correctement ✓ - Forum Oracle
9 réponses
Bonjour
Il faut utiliser une collation bin (en choisissant la bonne selon ton encodage) :
Il faut utiliser une collation bin (en choisissant la bonne selon ton encodage) :
...WHERE UCASE(ortho) collate utf8_bin LIKE UCASE('$mot')...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
oops désolé, j'actualisais la page avec l'ancre de mon message et donc tes messages n'apparaissaient pas ! Vraiment désolé et merci de ta réponse, je vais essayer ça et je te tiens au courant... Encore merci !
Alors ça me met cette erreur : Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource...
Je te met ma nouvelle requête :
Merci encore de ton aide !
Je te met ma nouvelle requête :
SELECT * FROM lexique WHERE UCASE(ortho) collate utf8_bin LIKE UCASE('$mot') ORDER BY freq DESC
Merci encore de ton aide !
La requête a l'air d'être correcte.
Tu peux donner le bout de code de la préparation de la requête au mysql_fetch_array ?
Tu peux donner le bout de code de la préparation de la requête au mysql_fetch_array ?
function type($mot) { // Donne le premier type du mot $base = mysql_connect ('localhost:/tmp/mysql5.sock', '****', '****'); mysql_select_db ('****', $base); $reponseb = mysql_query("SELECT * FROM lexique WHERE UCASE(ortho) collate utf8_bin LIKE UCASE('$mot') ORDER BY freq DESC"); $aaa = 'a' ; while ($donneesb = mysql_fetch_array($reponseb) AND $aaa == 'a') { $type = $donneesb['type']; $aaa = 'b' ; } if ($type == "") { $type = "NPRO" ; } return $type ; }
Voilà merci encore !
Curieux ton nom d'hôte 'localhost:/tmp/mysql5.sock'. J'ai plus l'habitude de voir localhost tout court, mais je suppose quand même que c'est bien celui que t'a donné ton hébergeur.
Ton message d'erreur signifie qu'il y a eu un problème d'exécution de la requête. comme ce problème peut venir d'un problème de connexion, on va rajouter (pour diagnostic, tu pourras les retirer après) quelques 'or die (mysql_error())'
Quelques remarques quand même sur ton code :
Ta connexion à ta base de données est à l'intérieur d'une fonction. Ce n'est pas très logique : en principe, tu n'as à te connecter à ta base de données qu'une seule fois, alors que ta fonction est destinée à être appelée plusieurs fois. Et si tu utilises ta base de données ailleurs dans ton script, tu l'ouvres aussi à chaque fois ? C'est un gros gaspillage de ressources.
Il vaut mieux mettre la connexion dans un fichier inclus et mettre un instruction include_once : la connexion sera faite une seule fois.
Et à quoi sert ton $aaa = 'a' ; ? À t'arrêter dès la première réponse ? Mais si tu ne veux pas boucler sur plusieurs réponse, il ne faut pas utiliser de boucle, tout simplement ! Tu peux tester avec un simple if :
Ton message d'erreur signifie qu'il y a eu un problème d'exécution de la requête. comme ce problème peut venir d'un problème de connexion, on va rajouter (pour diagnostic, tu pourras les retirer après) quelques 'or die (mysql_error())'
$base = mysql_connect ('localhost:/tmp/mysql5.sock', '****', '****') or die (mysql_error()); mysql_select_db ('****', $base) or die (mysql_error()); $reponseb = mysql_query("SELECT * FROM lexique WHERE UCASE(ortho) collate utf8_bin LIKE UCASE('$mot') ORDER BY freq DESC") or die (mysql_error());
Quelques remarques quand même sur ton code :
Ta connexion à ta base de données est à l'intérieur d'une fonction. Ce n'est pas très logique : en principe, tu n'as à te connecter à ta base de données qu'une seule fois, alors que ta fonction est destinée à être appelée plusieurs fois. Et si tu utilises ta base de données ailleurs dans ton script, tu l'ouvres aussi à chaque fois ? C'est un gros gaspillage de ressources.
Il vaut mieux mettre la connexion dans un fichier inclus et mettre un instruction include_once : la connexion sera faite une seule fois.
Et à quoi sert ton $aaa = 'a' ; ? À t'arrêter dès la première réponse ? Mais si tu ne veux pas boucler sur plusieurs réponse, il ne faut pas utiliser de boucle, tout simplement ! Tu peux tester avec un simple if :
if ($donneesb = mysql_fetch_array($reponseb)) $type = $donneesb['type']; else $type = "NPRO" ;