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 :

UTF8 avec Oracle


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut UTF8 avec Oracle
    Bonjour,

    Voici ce que je veux faire : insérer des caractères arabes dans une base Oracle 10g via un WebService.

    Le problème c'est que les données arabes (UTF8) se retrouvent sous forme de ? à l'envers en base.

    Les WS tournent sur un serveur Jonas 4.8.6 et nous utilisons Hibernate (en version 3). Je ne poste pas ce message sur le forum Hibernate parce que j'ai déjà tenté ces solutions sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		<property name="hibernate.connection.useUnicode">true</property>
    		<property name="hibernate.connection.defaultNChar">true</property>		
            <property name="hibernate.connection.characterEncoding">utf-8</property>
    En parcourant le net j'ai trouvé un solution qui consiste à passer directement par une connection JDBC et caster mes valeurs UTF8 en NCHAR comme çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    stmt = connection.prepareStatement(query);
    ((OraclePreparedStatement)stmt).setFormOfUse(1,OraclePreparedStatement.FORM_NCHAR);
    Cette technique fonctionne sur un "batch" lorsqu'on utilise une JVM sans Jonas. Mais dans le cas du WS, la commande prepareStatement retourne un JStatement (implementation de PreparedStatement par Jonas) se qui provoque un ClassCastExcpetion lors du FormOfUse ...

    J'ai donc épuisé toutes mes possibilités ...
    Est-ce que quelqu'un à une idée ??

    Merci.


    ps : je précise que les colonnes de la table dans laquelle on insère les données sont du type NVARCHAR2.

  2. #2
    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
    Quel est l'encodage utilisé par la base de donnée oracle pour son stockage physique? En fait, avec ta config hibernate montrée, tes données vont être transférées en utf-8 vers oracle, qui va ensuite faire une conversion "utf-8 -> encodage interne" avant le stockage. Si l'encodage interne choisi lors de la création de la database oracle n'a pas les caractères arabes, çà passera pas. On a eu le cas au boulot avec des caractère spéciaux tels que la double quotes ouvrante qui passaient pas lors de copier / coller depuis office.

    Plus d'infos ici:

    http://download-uk.oracle.com/docs/c...a96529/ch2.htm

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Merci pour cette précision.
    A vrai dire je ne sais pas quel encodage a été choisi mais je ne pense pas qu'il y ait de soucis de ce côté car d'une part je peux insérer des données arabes via PL/SQL et les lire dans une IHM et d'autre part la "technique" des OraclePreparedStatement fonctionne quand on ne passe pas par Jonas.

    Existe-il un autre moyen de "caster" le type des données insérée en utilisant JDBC sachant que les PreparedStatement sont de type JStatement ?

  4. #4
    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
    y a normalement pas besoin de cette technique. L'utilisation de Strings java devrait suffire. Tu indique que c'est jonas qui gère les connections et qu'il wrappe des trucs là dedans. Est-il possible de ne pas utiliser un connection pool de jonas, mais d'utiliser plutot un connection pool directement au niveau d'hibernate? Sinon, affiche la config du connection pool au niveau de jonas.

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    C'est bien çà le problème ... NORMALEMENT çà devrait marcher ... mais non.
    Voilà comment çà fonctionne :

    conf d'Hibernate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <property name="connection.datasource">RCEPCHDS</property>
    <property name="hibernate.connection.useUnicode">true</property>
    <property name="hibernate.connection.defaultNChar">true</property>		
    <property name="hibernate.connection.characterEncoding">utf-8</property>
    jonas-web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <jonas-resource>
          <res-ref-name>jdbc/mydb</res-ref-name>
          <jndi-name>RCEPCHDS</jndi-name>
    	 <connection-property name = "oracle.jdbc.defaultNChar">true</connection-property>      
    </jonas-resource>
    web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <resource-ref>
                    <description>DB Connection</description>
    		<res-ref-name>jdbc/mydb</res-ref-name>
    		<res-type>javax.sql.DataSource</res-type>
    		<res-auth>Container</res-auth>
    </resource-ref>
    Cette conf signifie qu'Hibernate va utiliser le DataSource RCEPCHDS. Ce dernier est initialisé par Jonas.

    RCEPCHDS.properties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    jdbc.minconpool=0
    jdbc.maxwaittime=10
    datasource.classname=oracle.jdbc.driver.OracleDriver
    jdbc.connchecklevel=1
    jdbc.maxconpool=-1
    datasource.url=jdbc\:oracle\:thin\:@ipdelamachine\:port\:P44R001
    jdbc.maxwaiters=1000
    datasource.mapper=rdb.oracle
    jdbc.connteststmt=select * from dual
    datasource.description=SUISSE
    datasource.password=password
    datasource.name=RCEPCHDS 
    datasource.username=user
    jdbc.maxopentime=1440
    jdbc.connmaxage=1440
    jdbc.defaultNChar=true
    Logiquement, si j'utilise hibernate pour insérer mes objets en base, les string (qui sont en UTF8 en java) devraient retenir mes caractères arabes comme il faut. Bizarrement ce n'est pas le cas.
    De la j'ai utilisé la technique des PreparedStatement qui permet de contourner Hibernate. Au final le pool de connection utilisé est le même, il s'agit de celui du Datasource RCEPCHDS...
    Et avec Jonas la méthode connection.preparedStatement retourne un JStatement qui ne permet pas de caster mes variable String en Nvarchar.

    Est-ce plus clair ?

  6. #6
    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
    je vois que nulle part, dans la configuration du pool où tu n'a précisé l'encodage à utiliser pour la connection.... Et je crains donc qu'il soit passé en iso-8859-1. T'as bien mis çà dans hibernate, mais comme c'est pas hibernate qui établit la connection, çà sert à rien à cet endroit là. Maintenant, je connais pas suffisament jonas pour te dire ce que tu dois mettre dans ton fichier properties.

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Ok merci je vais regarder de ce côté.

  8. #8
    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
    Je viens de tilter, on avais eu le même problème et pas moyen de faire switcher l'encodage des caractères vers quelque chose de potable. On a cherché cherché, et on en a conclu que le driver jdbc ignorait en fait toutes les demande de précser l'encodage. On avait résolu avec çà:


    mais c'est une valeur à configurer pour toute la jvm (paramètre de démarrage) !!

  9. #9
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Parfait, ca me parait être une bonne idée
    Il faut que je vois si ca marche et si ca n'impacte pas les autres applis.

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Re,

    Pour info, le -Dfile.encoding = UTF8 ne résoud pas mon problème.
    Je suis sur une nouvelle piste pour résoudre mon problème, je me dirige donc vers le forum Jonas.

    Merci pour l'aide.

Discussions similaires

  1. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38
  2. Quel langage avec Oracle????
    Par djedje11 dans le forum Langages de programmation
    Réponses: 11
    Dernier message: 16/03/2004, 11h15
  3. Réponses: 14
    Dernier message: 01/09/2003, 15h54
  4. Conseils pour developper une application avec Oracle
    Par belugha dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 02/06/2003, 16h03
  5. [Crystal Report 9] Changer de schéma avec Oracle
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 14/11/2002, 12h19

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