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 :

[Oracle][JDBC]Fail to convert between UTF8 and UCS2: failUTF


Sujet :

JDBC Java

  1. #1
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut [Oracle][JDBC]Fail to convert between UTF8 and UCS2: failUTF
    Bonjour à tous,

    j'explique mon problème qui est assez bizarre et en fait c'est un bug du driver JDBC, mais on ne sait jamais quelqu'un a peut-être trouvé une solution peut-être barbare mais qui fonctionne.

    J'ai une application web dont le character encoding est UTF-8.
    Le problème est qu'Oracle ne vérifie pas si le character encoding est bon pour certaine personnes qui au lieu de tout taper dans le textArea de l'application web il font un copy/paste par exemple de word ou d'un document pdf.

    Rien de bien grâve jusque là vu qu'avec sqlplus je sais quand même lire les données.

    Là où cela se corse c'est que quand j'essaye de faire une query à partir d'une application java pour extraire une partie des données j'ai une exception.

    Voici le bout de la query qui fait planter ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    qry = qry + " translate(utl_raw.cast_to_varchar2(dbms_lob.substr(b.proposal_abstract,2000,1)), chr(13)||chr(9)||chr(10), '    ') as short_abstract,";
     
    qry = qry + " to_char(utl_raw.cast_to_varchar2(dbms_lob.substr(b.proposal_abstract,2000,1))) as short_abstract,";
    Si je fais un
    j'ai cette exception

    Fail to convert between UTF8 and UCS2: failUTF8Conv
    Maintenant au lieu de faire un rs.getString() je crée un BufferedReader pour lire la valeur de la colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bf=new BufferedReader(new InputStreamReader(rs.getBinaryStream(18)));
    Mais j'ai un NullPointerException

    Donc en résumé mon programme fonctionne bien jusqu'au moment où il tombe sur le blob qui contient des caractères exotiques.

    Sur 150.000 lignes qu'il doit me retourner il m'en ressort les 10.000 premières mais à la 10.001 il foire car l'utilisateur a utilisé (on suppose) un copy/paste à partir d'un editeur de texte qui n'utilise pas UTF-8.

    En fait ce sont des blobs.

    J'ai été voir sur metalink et sur le forum d'oracle, mais aucun workaround à ce jour n'a été implémenté.

    Si quelqu'un a une idée elle est la bienvenue.

    Ce que je ne comprends pas c'est pourquoi j'ai un NullPointerException.
    Pourtant il y a bien une valeur dans la colonne.

    D'avance merci pour vos réponses.
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

  2. #2
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    Je n'ai pas la solution au problème, mais peut-être quelque pistes.
    1 - ) Essaye avec getObject, pour voir si l'erreur est toujours présente. Sinon, essaye de caster.
    2 - ) Essaye avec getBlob puis getBinaryStream
    3 - ) Essaye avec d'autres types de flux getAsciiStream ou getCharacterStream
    4 - ) Pour le pb de NullPointer, vérifie le numéro de la colonne lors de l'appel au BinaryStream (17 et non 18???). Ca m'étonnerais que ce soit ca, car l'appel de cette méthode devrais renvoyer null que si la valeur est NULL. Mais bon ca c'est la théorie, tout dépends de l'implémentation du driver.
    5 - ) Si t'es sur que ca viens du driver, essaye de le mettre à jour. Ou, si c'est possible, passer de OCI à THIN (ou inversement )
    Bon courage.
    @+
    [EDIT] : regardes aussi les classes du driver, je crois qu'il existe des classes spécifiques à Oracle pour la gestion des BLOB.
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Senior Développeur JEE
    Inscrit en
    Avril 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Senior Développeur JEE
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2002
    Messages : 795
    Points : 1 660
    Points
    1 660
    Par défaut
    J'ai résolu le problème pour le NullPointerException.

    Je devais simplement jouer avec l'interface Blob

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Blob blob = rs.getBlob(17);
     
    bf=new BufferedReader(new InputStreamReader(blob.getBinaryStream()));
     
    line.setElementAt(bf.readLine(),16);
    Encore merci des conseils
    Langages : Java, SQL
    Outils : Eclipse, Intellij
    SGBD : Oracle, PostgreSQL
    Mes Articles

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

Discussions similaires

  1. Convertion implicite utf8 de la part d'Oracle ?
    Par Rakken dans le forum Administration
    Réponses: 11
    Dernier message: 27/11/2006, 10h26
  2. [Oracle][JDBC] Récupération du type LONG
    Par ZeKiD dans le forum JDBC
    Réponses: 3
    Dernier message: 08/09/2005, 13h29
  3. [Oracle][JDBC]sauvgarde du contenu tables
    Par zaiane dans le forum JDBC
    Réponses: 4
    Dernier message: 05/08/2005, 11h18
  4. ORACLE / JDBC => Insérer un CLOB ...
    Par Doze dans le forum Oracle
    Réponses: 4
    Dernier message: 15/04/2005, 09h53
  5. Ambiguity between 'TBitmap' and 'Windows::TBitmap' ???
    Par scifire dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2005, 12h44

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