Bonjour à tous.
Tout d'abord voici le problème que je cherche à régler.
Faire un select dans MySql sans différence des accents et majuscule (case sensitive).
Tout d'abord ma base de données est configurée en utf8_general_ci (qui est sensé être non sensible à la case), les tables sont toutes en utf8_general_ci et chaque colonne des table est en utf8_general_ci, Le servuer apache à bien le charset utf8 de définit.
Dans la logique utf8_general_ci est insensible à la case pourtant un
SELECT * FROM clients WHERE nom LIKE '%Gerard%';
Me retourne bien les Gerard mais étrangement certain Gérard ne sont pas retourner.
J'ai donc fait une recherche manuelle et en effet il y'a des problèmes.
C'est à dire qu'à certains moment les accentué sont différent, via phpmyadmin je parcours les clients et je tombe sur des
Gérard , gérard , Gerard , gerard , Gérard , gérard
J'ai donc identifier plusieurs cause possible
- Le navigateur utilisateur n'est pas mit sur le bon encodage
- Lors de l'importations des données depuis un ancien système a réencodé en utf8 ce qui était déjà encodé en utf8
Bref le problème est donc bien lié au données et nom à la structure.
Comment puis-je corrigé c'est problème d'accent sur les données en sachant que la base de données contient maintenant 200 000 référence et que je ne peux pas les traitées une à une.
J'aimerai donc que le jeux de caractère soit identique pour toute les données où comment corriger les gérard en gérard en masse car il n'y à pas que les gérard qui ont ce problème et c'est comme ça dans toutes mes tables, ce qui forcément lors d'une recherche ne retourne pas tous les résultats.
Pour les majuscule j'ai dû ajouter la fonction UPPER sur mes requêtes sinon avec une recherche gérard je n'avait pas les Gérard..... et pourtant tout est bien mis en general_ci
D'avance merci des solution que vous pourriez m'apporter.
Belle journée à tous
Spliffer
[EDIT]
dans l'immédiat et pour que se problème ne survient plus, j'ai créer une fonction qui parse une chaîne en utf8 si elle est dans un autres jeux de caractère (donc même si le navigateur force un jeux de caractère l'ut8 sera appliqué).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php
/**
* @methode : setUTF8
* @str (string) : Chaîne à passée en utf8
* @decode (booléen) : [false=Encode || true=Decode]
* @descr : Vérifie si une chaîne de caractère est en UTF8, sinon la converti en UTF8
* encode ou decode
**/
function setUTF8($str=false,$decode=false){
if($str == false){ return ''; }
if($decode === false){ return (mb_detect_encoding($str, 'UTF-8', true) == false) ? utf8_encode($str) : $str; }
else{ return (mb_detect_encoding($str, 'UTF-8', true) == false) ? $str : utf8_decode($str); }
}
// Exemple :
$nom = (isset($_POST['nom'])) ? addslashes(setUTF8($_POST['nom'])) : '';
// Et pour le décodé il suffit de passer le paramètre true en plus (chez moi tout est en utf8 donc pas besoin du décode)
$nom = stripslashes(setUTF8($db['nom'],true));
?> |
Avec celà je pense que je limite encore un peu le risque de jeux différent.
Il me faut encore corrigé le problème existant qui empêche une recherche correcte
[FIN EDIT]
Partager