|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : mars 2006 Messages : 89 ![]() |
Salut,
Je développe une appli multilingue en utilisant l'encodage UTF-8. Cela marche plutôt bien mais me pose un problème pour les tries alphabétiques, surtout que j'utilise une couche d'abstraction objet pour manipuler les données. par exemple, un classement alphabétique donne actuellement: au lieu de: Est-ce une bonne solution de convertir les caractères encodés en UTF-8 en ISO-8859-1 avant de les insérer en BDD afin de pouvoir conserver le trie? Si oui, comment convertir massivement un existant? Existe-t-il une solution plus simple? Merci pour vos conseils! |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Sur le plan général l'encodage n'a pas d'importance. C'est la collation qui en a...
A lire : http://sqlpro.developpez.com/cours/s...e=partie1#L4.2 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 * * * * * |
|
00
|
|
|
#3 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
|
|
|
00
|
|
|
#4 |
|
Nouveau Membre du Club
![]() Inscription : mars 2006 Messages : 89 ![]() |
Merci pour ces précisions!
J'ai lu la doc Mysql et je pense que le mieux pour mon appli est de prendre "utf8-unicode-ci" comme collation (au lieu du "latin-1-swedish"). Problème: la base existe et elle est remplie de données. J'ai vu qu'on pouvait convertir les tables et/ou colonnes. J'ai des soucis de deux ordres:
Est-ce la bonne stratégie? Comment passer toute ma base et ses données en "UTF8-unicode-ci"? |
|
|
00
|
|
|
#5 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Non, ce n'est pas la bonne stratégie. Changer l'encodage d'une colonne provoque une conversion, donc s'il y a des erreurs, les erreurs sont reproduites dans le nouvel encodage.
Pour éviter cela, il faut passer par le type BLOB, qui est l'exception à cette règle de conversion automatique. Je te suggère donc la procédure suivante :
|
|
|
00
|
|
|
#6 |
|
Nouveau Membre du Club
![]() Inscription : mars 2006 Messages : 89 ![]() |
Cette idée n'a rien donné, j'ai toujours les mauvais caractères pour les accents dans ma colonne...
Autre stratégie:
Un peu lourd, mais y'a-t-il une alternative? |
|
|
00
|
|
|
#7 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
si ça n'a pas marché, c'est que probablement tes données sont bonnes, et que c'est l'affichage qui déconne. Donc évite de transformer à la main, ça ne devrait rien changer.
Je te donne des tests pour vérifier ça dans la soirée. |
|
|
00
|
|
|
#8 | ||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Donc, tu choisis une colonne passée en utf8, pour laquelle tu des problèmes d'affichage. Par exemple, mettons que la colonne Truc de la table Machin contienne le mot étrange, qui apparaît comme étrange.
Code :
|
||
|
|
00
|
|
|
#9 | ||
|
Nouveau Membre du Club
![]() Inscription : mars 2006 Messages : 89 ![]() |
Merci pour cette requête de test
![]() Voici qq résultats: Code :
Je vais refaire un test en local en reconstruisant la bdd dès le départ en utf-8 parce que je commence à m'embrouiller un peu... |
||
|
|
00
|
|
|
#10 |
|
Nouveau Membre du Club
![]() Inscription : mars 2006 Messages : 89 ![]() |
J'ai recréé mon schéma en local basé sur ut8 + ut8_unicode_ci et j'ai testé l'enregistrement via l'application de qq données avec accents: le problème ne change en rien.
Les pages de l'appli sont encodées en charset UTF8, le problème vient apparemment des formulaires de saisie de données: les données récupérées avec des accents sont déjà "transformées" avec les caractères spéciaux stockés en bdd... Juste une question: sous phpMyAdmin, si je consulte les données de la base, dois-je voir apparaître les accents normalement ou sont-ils codés? |
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Au vu de ton test... essaie ce coup-là :
- tu prends ta colonne utf8 et tu la repasses en latin1 (café va rester café, mais sur 5 octets) - tu la passes en BLOB - tu la passes en utf8 (café doit être réinterprété en café) |
|
|
00
|
|
|
#12 |
|
Nouveau Membre du Club
![]() Inscription : mars 2006 Messages : 89 ![]() |
ok, merci pour toutes ces idées mais...
ca ne changera pas mon problème, il faut que j'arrive à bien enregistrer les données dans la base: on dirait que le problème vient de mon charset UTF-8 dans mes pages HTML/PHP, car les accents des champs de saisie sont récupérés codés ("é" devient "é") et donc mal stockés en bdd. une fois que j'aurais réglé çà, il faudra que je mette à jour l'ensemble des données déjà existantes, mais je referai d'autres tests avant de mettre le feu à la base de prod...
|
|
|
00
|
|
|
#13 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
OK...
Note qu'il n'est pas du tout nécessaire que ta page PHP soit en utf8. L'important est juste que tout soit déclaré correctement. Je te suggère les tests suivants : côté PHP, tu passes cette requête : Le é qui s'affiche correctement est celui de l'encodage réel de la page PHP. Ensuite tu passes cette requête-là, toujours à partir de PHP : si par exemple le premier test révèle que l'encodage réel de ta page PHP est en latin1, et que le second dit que le caracter_set_client est déclaré comme utf8, il faudra que tu re-déclares ton encodage, en passant cette requête juste après ton mysql_connect : |
|
|
00
|
|
|
#14 | ||
|
Nouveau Membre du Club
![]() Inscription : mars 2006 Messages : 89 ![]() |
Ces tests m'ont permis d'avancer sur la voie de la solution... car effectivement, PHP était en 'latin'!
J'ai désormais mes accents en BDD! ![]() Pour info, voilà la config Symfony1.0/Propel du fichier databases.yml: Code :
Et encore merci beaucoup pour ton aide! |
||
|
|
00
|
|
|
#15 | ||
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Citation:
Citation:
![]() Tout réimporter ? |
||
|
|
00
|
|
|
#16 | ||
|
Nouveau Membre du Club
![]() Inscription : mars 2006 Messages : 89 ![]() |
Citation:
Citation:
![]() d'après la fonction "iconv_get_encoding()", PHP semble configuré en ISO-8859-1, alors que j'ai pourtant spécifié utf-8 dans un fichier de config Symfony - enfin bref, il s'agit d'un problème PHP/Symfony en l'occurence. Pour la prod, je sais pas trop comment je vais faire, mais ce qui est sûr, c'est qu'il y aura des trucs que je ne pourrai pas corriger, comme le texte qui était "strippé" par exemple pour obtenir des URLs "friendly". Mon client a eu la bonne idée de rentrer tous ses articles à toute vitesse à peine le truc lancé, et ce problème n'avait pas été détecté en recette... J'essaierai demain, il doit en être à la moitié de son catalogue pour le moment... |
||
|
|
00
|
|
|
#18 |
![]() ![]() ![]() Antoine DinimantConsultant en Business Intelligence Inscription : octobre 2006 Messages : 5 854 ![]() |
Bravo pour t'en être sorti !
Et merci pour le lien, je pense que je vais intégrer ça dans une prochaine FAQ. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com