Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Outils
Outils Forum d'entraide sur les outils pour MySQL. Avant de poster -> Outils 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 22/02/2008, 20h41   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 24
Points : 10
Points : 10
Par défaut pb encodage utf8

Bonjour,

Je relance ce sujet (http://www.developpez.net/forums/sho...d.php?t=472947) car je rencontre un problème identique.
ça va être un peu long mais je vais détailler ce qui m'arrive

Je travaille à créer une nouvelle version d'un site pour le passer de ISS/SQL server à IIS/mysql le tout sur du windows 2000 server .

Le site comporte aussi des documents stockés dans la base et de nombreux articles sous forme de fichiers asp écrit en dur sur le disque.
Ces fichiers et les données de la bases sont encodés en iso latin.

J'ai crée une 1er version du nouveau site dont l'encodage est latin1 dans mysql et cela fonctionne globalement mise à part le fait que je n'arrive à valider w3c en xhtml strict.

Après réflexion j'ai donc décidé d'encoder la nouvelle version du site en utf-8.

J'ai changé les paramètres de l'en-tete http dans iss pour le passer en utf8.
J'ai vérifié avec http://web-sniffer.net le serveur renvoi un content type égal à "text/html; charset=utf-8"

J'ai aussi inséré
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> dans le head des mes pages.

Pour encoder en utf8 les fichiers écrit dur en j'ai trouvé un petit logiciel du nom d'"unifier" qui fait très bien le job à l'image de ce que fait iconv en unix. Pas de problèmes particulier les accents sont bien rendu.

Reste plus qu'à afficher correctement le contenu stocké en base de données et je n'y arrive pas.

J
  • J'ai d'abord essayé cette méthode
1 - Je dump ma base en latin avec cette commande
Code :
mysqldump -h localhost --user=root -p --default-character-set=latin1 -c dbname --insert-ignore --skip-set-charset > dumplatin.sql
2- Je convertit le fichier dumplatin.sql en utf8 avec Notifier et je le renomme dumputf8.sql

3- Je supprime ma base et j'en crée une nouvelle en UTF8

Code :
mysql --user=root -p --execute="DROP DATABASE dbname; CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;"
4 - J'importe dumputf8.sql dans ma base avec
Code :
mysql --user=root --max_allowed_packet=16M -p --default-character-set=utf8 dbname <dumputf8.sql
J'obtiens toujours une erreur sur la 1er ligne de mon fichier dumputf8.sql et ce quelque soit la 1er ligne de ce fichier.

Code :
1
2
Error Code: 1064 - You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near '&#65279;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */' at line 1
Quel est l'erreur dans cette méthode ?
Que signifie  et d'où ça vient ?

J'ai essayé les requetes du type "ALTER TABLE Lecteurs
MODIFY Ville VARCHAR(255) CHARSET utf8 ;" ou avec des "CONVERT(Ville USING utf8)" résultats : aucun changement dans le rendu des accents.

J'ai donné dans le set names = utf8 et j'ai passé tous les paramètres par defaut du serveur en UTF8.


Voici le résultat de la commande SHOW VARIABLES LIKE 'char%' ;
Code :
1
2
3
4
5
6
'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'utf8'
'character_set_results', 'utf8'
'character_set_server', 'utf8'
'character_set_system', 'utf8'
SHOW VARIABLES LIKE 'colla%'
Code :
1
2
3
'collation_connection', 'utf8_general_ci'
'collation_database', 'utf8_general_ci'
'collation_server', 'utf8_general_ci'

J'ai même créé des tables et des bases vierges en utf8 et j'y ai inséré des données de test mais rien n'y fais les caractères spéciaux issus de mysql sont mal affichés si je les encode en utf8.

J'ai oublié de préciser que la page qui execute le code et qui lit les données est aussi encodée en UTF-8.

Je vous livre aussi un exemple tout bête de code qui ne fonctionne pas quand TOUT est utf8.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<select>
<%sql5="SET NAMES utf8"
conn.execute SQL5
SQL6="SELECT * from departement order by id asc"
SET RS6 = server.createobject("ADODB.Recordset")	
RS6.Open sql6,Conn
Rs6.MoveFirst
Do While NOT Rs6.EOF
id=RS6("id")
dep=RS6("departement")
val=id
%>
<OPTION value="<%=id%>"><%=val&"-"&dep%></option>
<%
   RS6.MOVENEXT
Loop%>
</select>
Je ne sais plus quoi faire à présent alors je me tourne vers vous
elric47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 21h33   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
La gestion des jeux de caractères sous MySQL est bcp plus simple que ce que tu penses, mais totalement contre-intuitive (ce qui explique que tout le monde tombe dans le panneau).
Peux-tu repartir de ton export SQL Server ou pas ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 23h08   #3
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 24
Points : 10
Points : 10
Oui je peux repartir de MSSQL
elric47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 23h37   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Dans ce cas, la méthode est la suivante :
  1. A partir de SQL Server, tu génères ton fichier (ou tes fichiers) de données avec l'encodage le plus pratique pour toi (imaginons que ce soit latin1, càd ISO-8859-1 ou ISO-8859-15)
  2. Dans MySQL, tu crées tes tables vides avec les colonnes texte en utf8
  3. Tu charges les données en indiquant le jeu de caractères du fichier (latin1 dans cet exemple)

C'est tout. MySQL recevra les données latin1 et les convertira automatiquement en utf8.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 14h21   #5
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 24
Points : 10
Points : 10
Ok ça marche en faisant un export sql depuis sqlserver réimporté depuis mysql.

Cela dit je n'obtiens pas de bon résultats si je fais un select sur mssql et un insert dans mysql à travers une page asp. C'est le driver odbc de mysql qui est en cause
IT'S A BUG NOT A FEATURE

MyODBC 3.51.x doesn’t support Unicode characters. So we just
have to wait for MyODBC 5.0 Production.



http://bugs.mysql.com/bug.php?id=3348


Merci ANTOUN
elric47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2008, 16h08   #6
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 24
Points : 10
Points : 10
Je pensais mon problème résolu et je constate que ce n'est plus tout à fait le cas. Je viens donc d'enlever le flag "RESOLU" à ce sujet

Mon problème d'encodage est bien résolu sur mon serveur de développement (windows2000) mais pas sur mon serveur de prod (w2003 server)

J'ai migré les bases de données correctement de w2000 à w2003 par une copie des tables depuis sqlyog. Mes tables sont bien encodées en UTf-8 sur le serveur w2003

J'ai installé le même driver ODBC 3.51.23 sur les 2 serveurs

J'ai specifié sur IIS6 de w2003 l'en tete http suivant : content-type : text/html;charset=utf-8.

J'ai vérifié avec web-sniffer que cet en-tete http étais bien pris en compte

J'affiche correctement les donnée sur w2003 serveur depuis mysql query administrator.

Depuis mes pages asp sur le serveur w2003 les caractères accentués stockées dans la base ne s'affiche pas correctement.

J'ai aussi changé le DSN sur mon serveur de dev windows 2000 pour qu'il interroge la base de mon serveur de prod w2003.
Mes pages asp sur mon serveur w2000 affiche correctement les caractères accentués stockés dans la base de mon serveur w2003!!!!!

La seule différence entre mes pages ASP de mon serveur w2000 et w2003 réside dans le fait que pour le moment j'ai du faire une connexion sans DSN.
Code :
1
2
3
4
5
6
7
8
SET CN = Server.CreateObject("ADODB.Connection")
cst = "Driver={MySQL ODBC 3.51 Driver};" & _ 
        "Server=localhost;" & _ 
        "Database=dbname;" & _ 
        "Uid=root;" & _ 
        "Pwd=password;" 
CN.open cst
CN.execute "set names utf8"
au lieu de
Code :
1
2
3
SET CN = Server.CreateObject("ADODB.Connection")
CN.Open "dsnname"
CN.execute "set names utf8"
en effet j'obtiens l'erreur suivante en utilisant la connexion DSN
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

Je précise que si je teste le même DSN depuis la console "ODBC driver source administrator" il fonctionne parfaitement.

Je peux très bien me passer de connexion avec DSN sauf si ça implique de ne pas afficher correctement les caractères accentués.

Auriez vous des pistes à me proposer pour résoudre mon problème ?

Merci d'avance
elric47 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2008, 02h44   #7
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
euh... aucune solution. Peut-être devrais-tu voir du côté du forum Windows ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2008, 08h59   #8
Candidat au titre de Membre du Club
 
Inscription : octobre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 24
Points : 10
Points : 10
pour info j'ai résolu mon pb de DSN en supprimant le USER DSN et en créant un SYSTEM DSN.

Le pb d'encodage des données utf8 est inchangé sur w2003.


J'ai installé sur w2003 le driver odbc 5.1 de mysql (version béta) et, crée un system DSN avec ce nouveau driver et miracle je n'ai plus de problème d'encodage.

le hic c'est que mysql recommande de ne pas installer ce driver sur un serveur de prod !

existe il d'autres drivers odbc pour mysql/windows 32 bits ?
elric47 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h33.


 
 
 
 
Partenaires

Hébergement Web