Problème de charset...

Résolu
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention   - 27 déc. 2020 à 18:56
Bonjour tour le monde (ou peut-être devrais-je dire bonjour Jordane pq on dirait bien qu'il n'y a que toi qui répond en fait ! :D )

J'ai une table mySQL contenant des recettes, encodée en latin_general (mea culpa, j'aurais dû changer le charset dès le début, j'ai oublié..) Du coup j'ai des données du type "Soupe%20de%20courgettes%20%E0%20la%20vache%20qui%20rit".
J'ai tenté utf8_decode, utf`8_encore, mb_encode mais rien ne fonctionne. J'ai aussi essayé de modifier l'encodage de la table mais heureusement que javais un backup pcq ça m'a tout détruit...
Je voudrais pouvoir nettoyer la table, c'est l'option la plus propre, mais je ne sais plus quoi faire. Faut-il que je e par un script php qui ferait un str_replace pour modifier ts les caractères spéciaux ou bien y a t'il plus simple ?
Merci d'avance et bonnes fêtes ! :-)



Configuration: Macintosh / Firefox 84.0

5 réponses

yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention    
bonjour,
je ne vois pas bien le lien entre l'encodage de la table et les données que tu nous montres.
tu pourrais peut-être faire ainsi:
update recettes set recette = replace (recette, '%20', ' ')
0
jordane45 Messages postés 38472 Date d'inscription   Statut Modérateur Dernière intervention   4 745
 
Bonjour,

Comme tu le vois, je ne suis pas le seul à répondre :-)

Comme le dit yg_be, tu vas devoir éditer le contenu de tes tables pour y remplacer les caractères spéciaux que tu y as mis.
Une fois que ça sera fait, il te restera à :
1 - Modifier le charset de tes tables
2 - Modifier le code php (ou autre langage...) qui te sert à faire les insertions dans ta bdd
Tu y as certainement utilisé des fonctions d'encodage des caractères html genre htmlspecialchars, htmlentities, urlencode ...
Les données, dans une BDD, ne doivent pas subir de traitement avant l'insertion ( on enregistre les données "brutes" )
Il te faudra ensuite t'assurer que lorsque tu utilises les données de ta bdd tu n'utilises pas non plus de fonctionnalités de ce genre (ce qui ajouterait de nouveau des caractères spéciaux dans ta page .. genre utf8-encode ou decode... )



0
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2
 
Oui, je vois, ça faisait longtemps que personne d'autre que toi ne m'avait pas répondu, je commençais à croire que tu avais le monopole... :D Et au age, je croyais aussi que tu étais une femme ! :D

En fait je n'ai utilisé aucune formule, aucun encodage, j'ai simplement fait un curl en php et ensuite j'ai tout récupéré en jquery/ ajax pour enregistrer le contenu tel quel dans ma table. utf8-encode ou decode c'était seulement au moment de l'affichage qd j'ai consaté qu'il y avait un pb dans la base.
Du coup peut-être que je devrais, au contraire, "nettoyer" ces contenus par un filter_var ou autre ?
0
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2
 
Bonjour, merci pour ta réponse ! :-)
Pour le lien, je ne sais pas trop à vrai dire, mais je ne peux que constater que j'ai un pb de charset à l'affichage et qu'en l'occurrence les données n'ont pas été enregistrées au bon format (or elles l'étaient au départ)
Cette option est très bien oui, bonne idée, mais elle est tout aussi longue à coder qu'un str_replace en php. Si il faut je ferais comme ça mais il n'existe pas une formule toute prête pour tout réencoder ? Ce n'est pas un manque de courage mais en fait j'ai surtout peur d'oublier certains caractères et de laisser des erreurs...
0
jordane45 Messages postés 38472 Date d'inscription   Statut Modérateur Dernière intervention   4 745
 
Non, aucune solution toute faite existe pour ça.
Il va te falloir faire les replace en SQL par toi même.
( à faire via l'onglet SQL de ton phpmy .... pas via un langage php... )

NB: Pour t'aider à savoir quoi remplacer.. il faudrait déjà nous montrer le code qui te sert à faire ces enregistrements dans ta bdd... ça devrait donner de bonnes pistes...
0
yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention   1 582
 
le texte que tu montres ne résulte pas d'un problème de charset.
comment fais-tu précisément l'affichage?
as-tu vérifié l'affichage via phpmy?
0
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2 > yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui, l'exemple que j'ai donné c'est ce qui est enregistré ds la base, pas simplement ce qui s'affiche. C'est pour ça que j'ai essayé de l'interpréter pr qu'il s'affiche correctement mais sans succès...
Je ne vois pas du tout à quel moment ça a déconné pcq je procède de la même façon pr enregistrer les ingrédients(ds une autre table mais avec les mêmes paramètres) et là tout est nickel...
0
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2
 
Oui c'est clair que déjà en ant par phpmy et en faisant toute la table d'un coup, je vais gagner b de temps. Sur 100 000 lignes, je ne vais pas détailler, il faut simplement que je change tous les caractères spéciaux, en gros, mais c'est là que je veux être sûre de n'en oublier aucun.

Mon code est un peu long et il y a plusieurs versions selon la source pcq je suis en train de scraper plusieurs sites pour me faire un outil de nutrition perso. Pour résumer il y a d'abord un curl en php puis je récupère le contenu en jquery / ajax, mais les scripts changent selon le site scrapé...
Du coup je ne sais même pas quoi te montrer. Par contre une fois la base nettoyée, il ne servira plus, normalement (100 000 recettes, ça me suffit je pense.... ;-) )
0
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2
 
Mais je devrai qd même er par php pcq j'ai une connexion pourrie donc je vas devoir faire un curl et lancer la requête en plusieurs fois. Jamais je ne pourrais tout faire d'un coup sans planter....
0
yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention   1 582 > ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention  
 
si tu entres la commande update, elle devrait s'exécuter, même si ta connexion se coupe par la suite.
0
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2 > yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention  
 
oh !? en voilà une bonne nouvelle !! Je vais essayer ça alors, merci beaucoup ! :)
0
yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention   1 582
 
tu peux ensuite faire une requête pour vérifier si il reste un "%" dans une des recettes.
0
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2 > yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention  
 
Génial, il ne me reste plus qu'à trouver la liste exhaustive des caractères spéciaux alors pr préparer ma requête, et je la ferai tourner ce soir. Je te tiens au courant ! :-)
0

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

Posez votre question
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2
 
idem avec la requête telle que tu l'as écrite
update recettes set titre = replace(titre, '%e9', 'é') where instr(titre, '%e9') > 0 

(mais ça reconnait bien les lignes si je fais un select)
0
yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention   1 582
 
montre le select.
0