Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/04/2011, 11h39   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 18
Points : 13
Points : 13
Par défaut SQL de recherche sans accent.

Bien le bonjour, voila mon problème, j'ai un formulaire e recherche avec des contrainte de ouf dans tout les sens.

Voila ma config obligatoire car pc bridé à mort :
phpmyadmin v3.3.9;
PHP v5.3.5
Apache v2.2.17;
Jeu de caractères pour MySQL: UTF-8 Unicode (utf8);
Interclassement pour la connexion MySQL : utf8_general_ci;
Table en utf8_general_ci;
Format d'enregistrement du fichier en utf8 sans BOMsous notepad++;
header html : "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> ";

j'ai une table groupe avec comme champ groupe_id et groupe_nom.
et comme enregistrement j'ai :
1 Etudiants
2 Entreprises
4 étuDianTs

je quand je fait une recherche sur le terme 'étu' ou 'etu' j'aimerai avoir les enregistrement 1 et 4.

hors pour le moment se n'ai pas le cas...

ma requête sql :
Code php :
$reqsearch="SELECT * FROM `".$prefix."groupe` WHERE  CONVERT(LOWER(`groupe_id`) USING utf8) LIKE CONVERT('%".search_format($searchall)."%' USING utf8)  OR  CONVERT(LOWER(`groupe_nom`) USING utf8) LIKE CONVERT('%".search_format($searchall)."%' USING utf8) COLLATE utf8_general_ci; ";

avec comme fonction php :
Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function search_format($chaine)
	{
		$chaine=utf8_decode($chaine);
		$chaine=sans_accent($chaine);
		$chaine=mb_strtolower($chaine, 'UTF-8');
		return $chaine;
	}
 
	function sans_accent($chaine)
	{
	   $accent  ="ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ";
	   $noaccent="aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyyby";
	   return strtr(trim($chaine),$accent,$noaccent);
	}

Pour l'heure, quand je recherche 'etu' je n’obtient que l'enregistrement 1 et quand je tape 'étu' je n'ai que l'enregistrement 4.

Please help me !!!
Voila 10 heure que je passe sur cette bête idée que c'est possible (bien évidement je ne peu pas quitté ce cher UTF8 car contrainte client),j'ai essayé à peu près 100 écriture différente que l'on peu trouvé sur le sujet sur le net avec 80% de solution renvoyant de jolie erreur.

donc là sois je trouve le code, sois je trouve la fenêtre du 5ème.

Merci d'avance à tous.
hiroshi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2011, 12h05   #2
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 18
Points : 13
Points : 13
Après de nombreux test j'ai un peu affiné la chose.
ma requête passe maintenant par du UPPER :
Code php :
		$reqsearch="SELECT * FROM `".$prefix."groupe` WHERE  CONVERT(UPPER(`groupe_id`) USING utf8) LIKE CONVERT(UPPER('%".search_format($searchall)."%') USING utf8)  OR  CONVERT(UPPER(`groupe_nom`) USING utf8) LIKE CONVERT(UPPER('%".search_format($searchall)."%') USING utf8) COLLATE utf8_general_ci; ";

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function search_format($chaine)
	{
		$chaine=utf8_decode($chaine);
		$chaine=sans_accent($chaine);
		$chaine=mb_strtoupper($chaine, 'UTF-8');
		return $chaine;
	}
 
	function sans_accent($chaine)
	{
	   $accent  ="ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ";
	   $noaccent="aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyyby";
	   return strtr(trim($chaine),$accent,$noaccent);
	}

Maintenant, quand je recherche 'etu' je n’obtient toujours que l'enregistrement 1 mais quand je tape 'étu' j'ai l'enregistrement 1 et 4.

Alors il ne me suffit d'affiner encore une fois, mais comment ?
hiroshi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 01h02   #3
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
salut, tu peux préciser quel type de test pour les fonctions sur les chaines tout dépend de la collation de base ou forcée avec using...
en utf8, la comparaison binaire différencie un e d'un é, la version "general" non
ensuite "_ci" est insensible à la casse (majuscule/minuscule) alors que "_cs" y est sensible...

Lire la doc sur les collations et jeu de caractères de mysql
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 11h51   #4
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 18
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 18
Points : 13
Points : 13
Justement j'ai bien besoin de l’insensible à la casse,mais les upper ou lower était surtout en espèrent que les accents disparaissent.
Alors voila, par exemple, je rajoute en plus "_ai" (pour ne pas être sensible au accent, et là c'est le drame).
je crois que dans les config de mon .ini (que je ne peu changé par contrainte) je ne sois pas autorisé à utilisé tout ça.
hiroshi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 14h21   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
MySQL est très limité dans beaucoup de chose... Notamment dans les collations et ne sais pas gérer correctement les collations insensible aux caractères diacritiques (accents, cédille, ligature....) correctement.

A lire sur MySQL : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/04/2011, 15h15   #6
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 843
Points : 1 318
Points : 1 318
tu peux forcer le charset avec using pour les fonctions texte ou la collation avec collate lis ça par exemple.
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h18.


 
 
 
 
Partenaires

Hébergement Web