Jeux de caractères, interclassement et conversion

Petit nouveau ! | 7 Messages

13 sept. 2010, 13:20

Bonjour à tous,

Je viens demander votre aide car là je me noie complétement dans ma base Mysql où j'ai réussi à opérer un mélange que je n'arrive pas à démêler.

Tout d'abord pour poser la situation, il faut dire que je n'y connais rien en Base SQL et que j'ai cherché différentes solution qui n'ont pas fonctionné (voire ont aggravé le problème :cry: )

J'ai besoin de faire un moteur de recherche pour mon site, et celui-ci doit être insensible à la casse et aux accents. Facile me direz-vous, on choisi un interclassement adapté et le tour est joué. C'est là que ça commence à me poser soucis notamment parce que j'ai mal codé les choses au départ.

Sur ma page php j'ai cette ligne :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Mais dans phpmyadmin, ma base de données est en latin1_swedish_ci (enfin celle de mon site, parce que ma base de test, à force de tentatives diverses et variées est en un peu tout et n'importe quoi :p ). Donc déjà ça ne peut pas coller...

Il en résulte que si sur mon site l'affichage est normal (je rempli la BDD avec une page du site), dans ma BDD ça ressemble plutôt à ça :
C'était pendant la nuit du 8, novembre 397, au moyen âge on montrait encore, près de la collégiale, ...
Et du coup impossible de faire des recherches insensibles aux accents là dessus.

Je comprend bien que dans la base, les données sont formatées en utf8 et que la lecture se fait en latin1....
Ma question est donc la suivante : AU SECOURS !!! Comment je peux faire pour tout remettre d'aplomb ? :D

J'aimerais tout convertir dans un jeux de caractères et interclassement insensible casse/accents.

Merci beaucoup par avance pour vos lumières

Mammouth du PHP | 19672 Messages

14 sept. 2010, 13:53

Salut, si tu stockes tes données en utf8, il est préférable que le schéma lui-même soit aussi en utf8 et non en latin11.

Ça se fait lors de la création de la base elle-même :
CREATE SCHEMA mabase DEFAULT CHARACTER SET = utf8 DEFAULT COLLATE = utf8_bin
De cette manière tu auras moins de soucis. Ensuite coté programmation, il ne faut pas oublier que les données traitées sont en utf8, et que tes pages HTML doivent l'être également. Il y a donc un header utf8 à préciser dans tes balises meta. Si tu as des caractères bizarres à l'écran, c'est que ton navigateur n'utilise pas le bon encodage tout simplement parce que le serveur (Apache ou autre) a envoyé le mauvais en-tête, par exemple latin1 (ou iso-8859-1). Mais du coup les champs de formulaire qui seront renvoyés vers le serveur seront encodés en latin 1 aussi : la recherche ne donnera pas de bon résultats s'il y a des accents ou des caractères spéciaux.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 7 Messages

14 sept. 2010, 21:22

D'accord, donc l'interclassement dans la BDD ne sert pas qu'a l'affichage. D'où mes échecs pour faire des recherches accentuées. Je pensais que ça ne jouait que sur l'affichage dans l'interface de phpmyadmin.

Le soucis c'est que ma base est déjà créée et comme elle comporte plus d'une centaine d'entrées, j'ai donc pas trop envie de devoir la refaire. L'idéale serait de la modifier. Mais lorsque je modifie dans phpmyadmin l'interclassement pour utf8_general_ci au lieu de latin1_swedish_ci dans un des champs (histoire de tester), ça ne change rien à l'affichage. J'ai toujours un affichage qui ressemble à ça : "Le domaine désolé et abandonné"
Par contre sur ma page web, l'affichage est toujours correct.

ViPHP
ViPHP | 5462 Messages

14 sept. 2010, 22:32

c'est au niveau de l'enregistrement que ca c'est mal passé, tu dois verfier tout la chaine, encodage du fichier, du serveur, de la connexion mysql, du jeux d'enregistrement mysql, il suffis qu'un sois différent pour que ca ne marche pas, je t'invite a lire le tuto sur l'utf-8 : faq-tutoriels/encodage-utf-t245062.html
au niveau de ta base de données va falloir reconvertir toutes tes valeurs

Petit nouveau ! | 7 Messages

16 sept. 2010, 20:20

Les choses s'arrangent doucement :D

Il manquait effectivement une information lors de l'enregistrement des informations depuis le site à savoir :
mysql_query("SET NAMES 'utf8'");
D'après ce que j'ai compris soit on configure le serveur pour l'utf8, soit quand ce n'est pas possible, comme c'est mon cas sur un serveur mutualisé, on indique à chaque insertion que c'est l'utf8 qui est de rigueur.
Du coup mes nouveaux ajouts apparaissent avec une accentuation normale.

Deuxième étape j'ai modifié la Base de donnée Mysql avec la fonction "ALTER". Il en resulte que je peux maintenant faire une recherche insensible aux accents (je n'ai pour l'instant testé qu'au sein de la base, mais il n'y a pas de raison que ça ne marche pas via le site).

Par contre l'affichage des anciennes données est toujours le même, même si la recherche avec ou sans accents fonctionne bien même sur ces données. Donc finalement ai-je vraiment besoin de modifier les enregistrements, ce n'est pas dit...
Si toutefois je veux le faire, existe t'il une solution plus simple faire un code qui lit les données et les réinscrit proprement ? Une commande SQL peut être ?

En tout cas merci beaucoup pour l'aide déjà apporté, je désespérais d'en voir un jour le bout.

Mammouth du PHP | 19672 Messages

19 sept. 2010, 11:06

Un truc à envisager, ce serait un traitement des données avec utf8_decode() ou utf8_encode() dans une boucle UPDATE sur la base, si possible avant d'ajouter trop de nouvelles données. Si tu as des données avec deux types d'encodage, ça va être la galère à gérer.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: