Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > JDBC
JDBC Forum d'entraide sur l'API JDBC (Java Database Connectivity) et l'accès aux bases de données. Avant de poster -> FAQ JDBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/12/2012, 09h32   #1
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
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 :
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 :
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
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 20h04   #2
fraco
Membre chevronné
 
Avatar de fraco
 
Inscription : juin 2006
Messages : 737
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 737
Points : 757
Points : 757
Salut !
Un PreparedStatement pourrait-il faire l'affaire ?
fraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 11h13   #3
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
Merci de ta réponse, je vais tester !
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 14h07   #4
chtig
Membre Expert
 
Inscription : janvier 2007
Messages : 1 331
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 331
Points : 1 561
Points : 1 561
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)
__________________
Program manager chez TraceOne. http://www.traceone.com
chtig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 14h59   #5
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
En faisant ça

Code :
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.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 15h14   #6
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
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
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 15h18   #7
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
J'avais pas vu ta réponse tchize_, je teste tout ça, merci.
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 15h28   #8
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
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 "?".
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 15h47   #9
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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?
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 16h08   #10
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
Oui dans la console d'eclipse.

Il m'affiche bien <é> si je fais un System.out.println(" <\u00e9>").
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 16h12   #11
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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?
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 16h16   #12
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
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 é.
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 16h46   #13
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 16h57   #14
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
J'avais déjà essayé le
Sans succès malheureusement.
Je vais tester le SendStringParametersAsUnicode.

Merci
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 16h54   #15
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
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
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 18h15   #16
Népomucène
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 1 318
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 : 1 318
Points : 2 225
Points : 2 225
Si tes 2 bases sont sur le même serveur, alors :
Code :
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 !
__________________
·· −· −−· ·· ·−· ··− −− ·· −− ··− ··· −· −−− −·−· − ·
· − −·−· −−− −· ··· ··− −− ·· −− ··− ·−· ·· −−· −· ··
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 10h48   #17
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
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
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h07   #18
maxwell374
Invité régulier
 
Inscription : septembre 2010
Messages : 51
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 51
Points : 9
Points : 9
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
maxwell374 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h45   #19
Népomucène
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 1 318
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 : 1 318
Points : 2 225
Points : 2 225
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.
__________________
·· −· −−· ·· ·−· ··− −− ·· −− ··− ··· −· −−− −·−· − ·
· − −·−· −−− −· ··· ··− −− ·· −− ··− ·−· ·· −−· −· ··
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 11h50   #20
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 280
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 280
Points : 32 756
Points : 32 756
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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 :
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.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h14.


 
 
 
 
Partenaires

Hébergement Web