SQL : tenir compte des accents mais pas de la casse

Fermé
mat8883 Messages postés 41 Date d'inscription mercredi 7 octobre 2009 Statut Membre Dernière intervention 26 février 2014 - 13 févr. 2013 à 15:31
 Utilisateur anonyme - 16 févr. 2013 à 07:44
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 :
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:

9 réponses

Utilisateur anonyme
13 févr. 2013 à 16:27
Bonjour

Il faut utiliser une collation bin (en choisissant la bonne selon ton encodage) :
...WHERE UCASE(ortho) collate utf8_bin LIKE UCASE('$mot')...
0
mat8883 Messages postés 41 Date d'inscription mercredi 7 octobre 2009 Statut Membre Dernière intervention 26 février 2014
13 févr. 2013 à 20:24
Quelqu'un a t-il une solution ?
0
Utilisateur anonyme
14 févr. 2013 à 08:41
As-tu vu ma réponse ?
Elle ne concerne que MySQL, quel SGBD utilises-tu ?
0
mat8883 Messages postés 41 Date d'inscription mercredi 7 octobre 2009 Statut Membre Dernière intervention 26 février 2014
14 févr. 2013 à 15:55
SVP je stagne vraiment... J'ai besoin de vous !
0
Utilisateur anonyme
14 févr. 2013 à 16:09
Tu joues avec mes nerfs, ou je suis devenu transparent ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mat8883 Messages postés 41 Date d'inscription mercredi 7 octobre 2009 Statut Membre Dernière intervention 26 février 2014
14 févr. 2013 à 16:43
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 !
0
mat8883 Messages postés 41 Date d'inscription mercredi 7 octobre 2009 Statut Membre Dernière intervention 26 février 2014
14 févr. 2013 à 17:03
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 :
SELECT * FROM lexique WHERE UCASE(ortho) collate utf8_bin LIKE UCASE('$mot') ORDER BY freq DESC

Merci encore de ton aide !
0
Utilisateur anonyme
14 févr. 2013 à 17:35
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 ?
0
mat8883 Messages postés 41 Date d'inscription mercredi 7 octobre 2009 Statut Membre Dernière intervention 26 février 2014
15 févr. 2013 à 19:50
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 !
0
Utilisateur anonyme
16 févr. 2013 à 07:44
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())'

	$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" ;
0