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 :

Problème d'accents lors d'un UPDATE


Sujet :

JDBC Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut Problème d'accents lors d'un UPDATE
    Bonjour,

    J'ai deux bases sql server 2008R2 (BD1 et DB2). Je souhaite sélectionner des données dans DB1 et les insérer dans BD2.

    Ex : Dans BD1, table salarié avec champs nom et prénom
    Quand je récupère ces données, pb avec les caractères spéciaux qui s'affichent avec un "?". Je passe donc par un encodage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String prenom = new String(resultSet.getBytes("PRENOM_SALARIE"),"ISO-8859-1");
    J'ai essayé avec UTF-8 mais ça ne passe qu'en ISO. L'encodage de la base (Classement) est "French_CI_AS".
    Une fois que j'ai mes données qui s'affichent correctement, je fais un UPDATE vers DB2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String requete = "UPDATE salarie SET prenom_salarie = '"+prenomSalarie+"', nom_salarie = '"+nomSalarie+"' WHERE id_salarie = "+idSalarie;
    Statement s = connexion.createStatement();
    //connexion est initialisé avant avec un DriverManager.getConnection(urlServeur);
    s.executeUpdate(requete);
    s.close();
    Une fois mise à jour les données dans DB2 s'affichent avec des "é" à la place des caractère spéciaux.
    Auriez-vous une solution à ce problème?
    Merci d'avance

  2. #2
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    Salut !
    Un PreparedStatement pourrait-il faire l'affaire ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Merci de ta réponse, je vais tester !

  4. #4
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    A priori c'est pas top de gérer l'encoding comme tu le fais. La "bonne" façon de procéder, c'est de spécifier l'encoding dans la chaîne de connection JDBC (cf la doc de ton driver JDBC)

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En faisant ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String prenom = new String(resultSet.getBytes("PRENOM_SALARIE"),"ISO-8859-1");
    Au mieux tu recrée exactement la même chaine (si ton encodage par défaut est iso-8859-1), au pire tu crée délibérément une chaine corrompue dans l'espoir de faire l'opération inverse d'une corruption qui a déjà eu lieu , avec 90% de chances de faire pire.

    Il faut faire les opération suivante:
    1) s'assurer que les données ne sont pas déjà corrompue sur la première base de données. Selon la même bidouille que tu fais, ça peux être le cas même sans s'en rendre compte. (Ton interface graphique habituelle merdouille symétriquement et donc "corrige" les données corrompue à l'affichage). Le plus simple pour ce check est de prendre un chaine contenant, par exemple Ä ou Ü ou d'autres caractères n'existant pas en iso-8859-1, de l'y stocker avec l'interface habituelle, et de lancer une requete SQL qui compte les caractères ou qui convertis en caractères non accentués ou qui, pour chaque caractère de la chaine, affiche sa valeur unicode. Tu saura tout de suite si le SGBD vois bien ce que tu pense qu'il vois
    2) comme dit, voir dans la config de ton driver si il parle bien le même encoding que la DB (souvent, c'est automatique, mais je ne connais pas SQL server)
    3) voir si c'est pas au transfert vers la deuxième DB que tu aurais le problème inverse (Envoyer une chaine connue genre "Héhéhé höµhòhó" et regarder si ça arrive correctement)
    4) voir si c'est pas à l'affichage final que tu as le problème.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Le preparedstatement n'a rien fait de mieux!
    Concernant l'encodage de la connexion j'ai tenté de rajouter "charset=UTF-8" à la fin de ma chaîne de connexion, sans succès.
    J'ai épluché la doc de mon driver (sqljdbc4.jar) et rien trouvé pour renseigner l'encodage. Je continue de chercher.

    Merci à vous

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    J'avais pas vu ta réponse tchize_, je teste tout ça, merci.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Une info qui peut, peut être, avoir son importance, quand je retire toute les conversions dans mon code et que j'affiche les données de mon select depuis ma première BD (d'où je tire mes données), tous les caractères spéciaux s'affichent avec un "?".

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par maxwell374 Voir le message
    tous les caractères spéciaux s'affichent avec un "?".

    Ils s'affichent dans la console? Si tu fais System.out.println(" <\u00e9>") ça affiche quoi?

  10. #10
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Oui dans la console d'eclipse.

    Il m'affiche bien <é> si je fais un System.out.println(" <\u00e9>").

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ok, donc le probleme est entre ton code et la DB numéro 1. Maintenant va falloir vérifier que les données sont correctes dans le DB1. Si c'est le cas, le problème est dans le tube du driver jdbc.

    Tu utilise quel driver?

  12. #12
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Le driver est sqljdbc4.jar.

    Concernant la BD1, quand je fais un insert avec un é, le champs s'affiche correctement, par contre si je fais un insert avec un é, il s'affiche avec é.

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par maxwell374 Voir le message
    Le driver est sqljdbc4.jar.

    Concernant la BD1, quand je fais un insert avec un é, le champs s'affiche correctement, par contre si je fais un insert avec un é, il s'affiche avec é.
    En gros il affiche ce que tu as stocké
    Bon, est-ce que si tu lance ton application en rajoutant aux paramètres de la JVM

    tu résoud ton problème? Javais eu une galère similaire sur oracle et j'ai découvert que le driver n'était pas configurable à ce sujet et utilisait... L'encodage par défaut de la plateforme . De toutes façons, ce n'est pas plus mal de forcer l'encodage par défaut de ton application

    Sinon, ton driver a un paramètre "SendStringParametersAsUnicode" qu'on peux mettre à true (sa valeur par défaut normalement).

    tu peux jouer aussi à le mettre à false :s

    Il y a aussi CodePageOverride mais là je le sent pas trop

  14. #14
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    J'avais déjà essayé le
    Sans succès malheureusement.
    Je vais tester le SendStringParametersAsUnicode.

    Merci

  15. #15
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Me revoici pour de nouvelles aventures !

    Mes tests avec SendStringParametersAsUnicode n'ont rien donnés.
    J'ai testé de transposer mon code en PHP (au point où j'en suis je ne suis plus à ça près) et la bingo ça passe avec les bons caractères spéciaux.

    Mes pages sont en UTF-8.

    Une idée ?

    Merci

  16. #16
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 705
    Points : 4 783
    Points
    4 783
    Par défaut
    Si tes 2 bases sont sur le même serveur, alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    USE DB1
    UPDATE salarie SET prenom_salarie =B.prenomSalarie, nom_salarie = B.nomSalarie
    FROM  salarie A INNER JOIN BD2..salarie B ON A.id_salarie = B.id_salarie
    Si tes bases ne sont pas sur le même serveur alors utilise openquery (Transaq-SQL)

    Pour de plus amples précisions poster sur le forum SQL Server

    Dans ce cas, rien à voir avec Java !
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  17. #17
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Merci de ta réponse.
    Mais je pense que le pb vient de java puisqu'en PHP mes données s'affichent correctement et pas en java (par ex "é" remplacé par "?" dans la console alors que le champ en base est correctement écrit).

    Effectivement l'update en sql est plus performant mais je réalise d'autres traitements (non présentés ici pour ne pas surcharger ma demande) qui me demandent de passer par une couche métier, d'où le pourquoi du code java.

    Merci

  18. #18
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Après de nouveaux tests, le pb vient de ma lecture des infos dans ma base où les caractères spéciaux s'affichent '?'.

    Base : SQL Server 2008 Management Studio 10.0.1600.22
    Driver : sqljdbc4.jar
    Java : 6 (mise à jour 26)
    Eclipse EE Juno

    Merci

  19. #19
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 705
    Points : 4 783
    Points
    4 783
    Par défaut
    En relisant le début de ton post, tu indiques que les champs de la table sont codés en "French_CI_AS" (voir SQL PRO)
    Il y a peut-être un conflit avec l'encodage par défaut du serveur. tu pourrais peut-être :
    1) créer une table temporaire de la même structure mais avec tous les champs varchar encodés autrement
    2) importer les données dans la table temporaire
    3) travailler avec cette table temp.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  20. #20
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    On n'a toujours pas testé le données en base, juste leur affichage à gauche et à droite.

    Peux-tu prendre une chaine déjà erronée en base, admettons que ce soit le 4ème caractère du champ Prenom, et dans editeur sql quelconque, lance la commande suivante:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select subString(Prenom,4,1) as lettre, UNICODE (subString(Prenom,4,1)) as valeur from table where .....
    Et dis nous ce que ça affiche.

    Dis nous en comparaison ce que ça affiche depuis java.

Discussions similaires

  1. [MySQL] Problème d'accent lors de la récupération d'infos
    Par 2rock dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 03/05/2009, 19h08
  2. [HTML] problème d'accent lors de l'affichage
    Par teac2006 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 20/06/2008, 18h06
  3. Problême d'accent lors de la création d'un fichier txt
    Par maxmarie dans le forum Windows Mobile
    Réponses: 15
    Dernier message: 24/08/2007, 22h59
  4. Réponses: 3
    Dernier message: 07/06/2007, 14h22
  5. Problème d'accent lors d'une requête
    Par escape dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/12/2006, 14h48

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