IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Bagarre avec les caractères spéciaux (base MySql)


Sujet :

JDBC Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Points : 25
    Points
    25
    Par défaut Bagarre avec les caractères spéciaux (base MySql)
    Bonjour,
    le problème que je rencontre est sans doute entre MySql et JDBC.
    Je n'ai pas trouvé de réponse sur le forum MySql, malgrés quelques discussions existantes sur des problèmes similaires.

    Voici le contexte :
    - une application web en java (JSF, classes métier, classes dao d'accès à la base),
    - serveur Tomcat 5.5.12
    - MySql 4.1.14 (défaut aussi avec version 5),
    - pilote JDBC : mysql-connector-java-3.1.12-bin.jar (défaut aussi avec versions plus récentes).
    - développement avec Eclipse 3.1.1

    Voici le problème :
    1) Des textes avec caractères spéciaux du français (é, è, ë,...) sont stockés dans la base.
    2) leur affichage dans le mode console de MySql lors de requêtes se fait correctement.
    3) et ô rage... : les mêmes carractères ne s'affichent pas correctement (remplacés par ? ou autres carractères plus "ésotériques") dès la sortie du ResultSet (testé dans la console de Eclipse) et à plus forte raison dans les pages HTML générées par des JSP, elles mêmes traitées par le framework JSF.
    Note : les caractères spéciaux s'affichent correctement s'ils sont directement mis dans un String de Java.

    J'ai déjà cherché dans plusieurs directions (avec l'aide de différents forums), et notamment en réglant les variables charsets de MySql à la création de la base (avant le chargement des données), par l'application avant les requêtes de consultation (données déjà chargées).

    Mais là, j'en perd mon latin (ou mon UTF8, je ne sais plus) !!!

    Le problème ne viendrait-il pas du pilote JDBC ?
    Quelqu'un peut-il confirmer ou non que le problème n'existe pas avec d'autres DB ?
    et enfin : Quelqu'un a-t-il une solution ?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il me semble que tu dois utiliser des paramètres de configuration lors de ta connection SQL, par exemple dans l'URL JDBC:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jdbc:mysql:domain/dbname?useUnicode=true&characterEncoding=UTF-8
    en utilisant UTF8 ou ISO-8859-1 selon le cas...

    a++

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    Merci de ta réaction rapide.
    J'ai testé ce que tu me conseille : rien ne change.
    A suivre...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    Bonjour,
    suite à quelques recherches je viens de découvir la chose suivante qui pourrait être une piste :
    1) le String de Java est conforme à la codification UTF-16 qui code les carractères sur 1 ou 2 mots de 16 bits.
    2) les normes UTF-8 ou ISO-8859-1 codent les charactères qui nous interessent ici (entre 00 et FF en Hexa) sur un octet.

    Sachant que seules ces deux dernières normes sont acceptées par MySql, que se passe-t-il lorsque les chaînes issues de MySql (1 octet) passent dans un String Java (un mot de 16 bit) ? Cela en tenant compte que le codage UTF-16 sur un mot de 16 bits (appliqué pour nos carractères) permet deux "endianness" (octet de poids fort en premier ou en deuxième).

    Là je suis en limite de connaissances, et, a fortiori, pour trouver la solution.

    Y a-t-il un spécialiste dans la salle ?

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    As-tu bien essayé un insertion et une récupération des données en utilisant les mêmes paramètres de configuration ???

    Par exemple je ne pense pas que les éléments insérés avant d'utiliser characterEncoding=UTF-8 ne seront pas correctement encodé ensuite...

    a++

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    Bien vu, et grand merci.

    En effet, les données chargées et relues avec l'application avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jdbc:mysql:domain/dbname?useUnicode=true&characterEncoding=UTF-8
    sont correctement restituées.

    Dans mon cas, les données qui posaient problèmes sont des données "invariables" et avaient été chargées (pour les tests de l'application) par un script en mode console de MySql, et sans paramétrage spécifique des charsets.

    Dans ce cas de figure (données en lecture) il faut donc veiller à les charger avec un bon paramétrage du script de chargement.

    Il me reste cela à tester.

    Je donnerai des nouvelles sur cette discussion (bien que mon problème de base soit résolu).

    Dans le cas où j'y arrive (!!!) et si cela parraît interessant pour la communauté, je pourrais rédiger une procédure (me le dire et m'indiquer où je puis la mettre à disposition).

    Encore merci et à bientôt.

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par JibéCC
    Dans le cas où j'y arrive (!!!) et si cela parraît interessant pour la communauté, je pourrais rédiger une procédure (me le dire et m'indiquer où je puis la mettre à disposition).
    Bien sûr que c'est intéressant

    Déjà en répondant sur ce sujet cela apportera l'info dans la base de connaissance du forum. Ensuite si tu as le temps tu peux toujours rédigé une Question/Reponse pour la FAQ JDBC dans le post suivant : F.A.Q JDBC - participez ici

    Elle sera ensuite publié sur le site lors de la prochaine mise à jours de la FAQ JDBC...

    a++

  8. #8
    Membre actif
    Inscrit en
    Juin 2005
    Messages
    303
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 303
    Points : 201
    Points
    201
    Par défaut
    Problème resolu

    en fait je developpe des EJB et j'avais le même probleme en insérant ceci dans le mysql-ds:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <connection-url>jdbc:mysql:domain/dbname?useUnicode=true&amp;characterEncod ing=utf8&amp;charactetrResultSets=utf8</connection-url>
    Il peut etre interessant de créer une FAQ la-dessus.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 35
    Points : 25
    Points
    25
    Par défaut
    Tu dois avoir quelque part dans ton code Java l'ordre de connexion JDBC à la base de donnée du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection con = DriverManager.getConnection(dbUrl, utilisateur, mdp);
    C'est en fait la variable dbUrl qui prend la valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jdbc:mysql:domain/dbname?useUnicode=true&characterEncoding=UTF-8
    en adaptant domain, dbname et UTF-8 à ton cas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les caractère spéciaux netvibes
    Par alas70 dans le forum Langage
    Réponses: 1
    Dernier message: 02/03/2007, 11h59
  2. Réponses: 13
    Dernier message: 06/11/2006, 01h55
  3. Problème avec les caractères spéciaux
    Par vincentj dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 01/09/2006, 15h49
  4. problème avec les caractères spéciaux
    Par jmarc1818 dans le forum Général Python
    Réponses: 1
    Dernier message: 16/03/2006, 15h55
  5. [SAX] Problème avec les caractères spéciaux
    Par abdou.sahraoui dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 18/07/2005, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo