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

Oracle Discussion :

probleme dans le recuperation des carectres speciaux : é,è à


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 58
    Points : 38
    Points
    38
    Par défaut probleme dans le recuperation des carectres speciaux : é,è à
    Bonjour tout le monde

    j'ai developpé une application qui gére des données à partir d'une base de donnée Oracle 9i. Le probleme reside dans la récuperation des caracteres speciaux dans les données(c'est à dire : é,è et à), ils ne sont pas recuperables et je les reçoi comme suit :

    é=e
    è=e
    à=a

    Merci bien pour vous

  2. #2
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    C'est un problème de NLS_LANGUAGE entre la base de données et le client.

    Que donne l'instruction suivante dans une session SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from nls_database_parameters;

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 58
    Points : 38
    Points
    38
    Par défaut
    merci pour ta reponse :
    elle donne comme suit :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CHARACTERSET               WE8ISO8859P1
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD-MON-RR
    NLS_DATE_LANGUAGE              AMERICAN
    NLS_SORT                       BINARY
    NLS_TIME_FORMAT                HH.MI.SSXFF AM
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
    NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
    NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
    NLS_DUAL_CURRENCY              $
    NLS_COMP                       BINARY
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE
    NLS_NCHAR_CHARACTERSET         AL16UTF16
    NLS_RDBMS_VERSION              9.2.0.1.0
     
    20 rows selected.

  4. #4
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    On peut mettre le NLS_LANG du client (là où s'exécute l'application) à la valeur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NLS_LANG=FRENCH_FRANCE.WE8ISO8859P1

  5. #5
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    En effet, tu as le nls_language AMERICAN, et les américains n'utilisent pas d'accent.
    Par contre je suis aussi interressé pour le changer parce que je viens de m'apercevoir que le nls_language de ma base est AMERICAN .
    Pourquoi faire aujourd'hui ce que l'on peut faire demain ...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 58
    Points : 38
    Points
    38
    Par défaut
    l'application est distribué (web)

    peut etre ainsi q'il faut mettre cette configuration chez mon serveur base de donnée ?

    Merci

  7. #7
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    Sur un serveur physique, on peut avoir un serveur Oracle et un client Oracle... De même pour le web.

    Cela dépend donc de ton architecture.

    En gros, tu dois avoir :
    - Un serveur Oracle installé sur une machine que nous appellerons Machine_Oracle
    - Un serveur Web installé sur une machine Machine_Web (qui peut être la même que celle au dessus )

    Ta connection par ton appli web suit donc le cheminement suivant :
    • Web Browser de l'utilisateur => Se connecte au serveur web installé sur la machine Machine_Web
      La machine Machine_Web ouvre une connexion SQL vers la base de données. Pour cela, elle utilise le client Oracle
      Le client Oracle utilise les informations de connexion et va demander l'exécution de ses requêtes sur le serveur Oracle gérant la base de données


    La variable doit donc être fixée sur la machine physique où se trouve ton serveur web, que ce soit la même machine que celle où se trouve la base de données, ou non.

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Je doute que cela vienne de là :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    SQL> select * from nls_database_parameters;
     
    PARAMETER                                                        VALUE
    ---------------------------------------------------------------- -----------------------------------
    NLS_LANGUAGE                                                     AMERICAN
    NLS_TERRITORY                                                    AMERICA
    NLS_CURRENCY                                                     $
    NLS_ISO_CURRENCY                                                 AMERICA
    NLS_NUMERIC_CHARACTERS                                           .,
    NLS_CALENDAR                                                     GREGORIAN
    NLS_DATE_FORMAT                                                  DD-MON-YY
    NLS_DATE_LANGUAGE                                                AMERICAN
    NLS_CHARACTERSET                                                 WE8ISO8859P1
    NLS_SORT                                                         BINARY
    NLS_TIME_FORMAT                                                  HH.MI.SSXFF AM
    NLS_TIMESTAMP_FORMAT                                             DD-MON-RR HH.MI.SSXFF AM
    NLS_TIME_TZ_FORMAT                                               HH.MI.SSXFF AM TZH:TZM
    NLS_TIMESTAMP_TZ_FORMAT                                          DD-MON-RR HH.MI.SSXFF AM TZH:TZM
    NLS_DUAL_CURRENCY                                                $
    NLS_NCHAR_CHARACTERSET                                           WE8ISO8859P1
    NLS_COMP                                                         BINARY
     
    17 rows selected.
     
    SQL> create table test_dvp (a varchar2(30));
    Table created.
     
    SQL> insert into test_dvp values ('éàè');
    1 row created.
     
    SQL> select * from test_dvp;
    A
    ------------------------------
    éàè
     
    1 row selected.
    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from v$nls_parameters;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  9. #9
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Points : 741
    Points
    741
    Billets dans le blog
    1
    Par défaut
    je pense que CD a raison,

    c' est le client qui interpréte les données, nous rencontrons le même
    pb sur une appli web en php qui n' a pas de client oracle installé .

    3 vues sont intéressantes :

    NLS_DATABASE_PARAMETERS
    NLS_INSTANCE_PARAMETERS
    NLS_SESSION_PARAMETRERS

    c' est la derniére qu' il faut en général interroger .

    cdlt

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Sauf que si ta base de données ne reconnaît pas les accents, il ne seront pas stockés !
    il faut regarder côté client pour voir si c'est un problème de restitution
    il faut regarder côté base de données pour voir si c'est un problème de stockage
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  11. #11
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Points : 741
    Points
    741
    Billets dans le blog
    1
    Par défaut
    oui ,
    evidemment, si les accents ne sont pas stockés aucun client n' arrivrera à les lire ...

  12. #12
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    D'après ce que j'ai pu en lire sur les conversions de caractères (j'ai un petit souci avec une base 8i qui exporte vers une base 10g, je perd des caractères justement ), c'est la chose suivante :

    Lorsque je fais un insert avec des caractères spéciaux, cela seront pris tels quels sans conversion, car on considère que le client fait un "insert direct" des valeurs dans la base. Par contre, on peut très bien avoir une conversion de la part du "client qui lance la connexion".

    Exemple : Je mets dans un coin cette requête, et je fais du copier/coller (depuis Word, HTML, n'import qui soit capable de mettre ces caractères spéciaux...):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into toto1 values (10, 'Ö ä € Ü' );
    Si je colle cela dans mon sql*plus sous dos, j'obtiens cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    insert into toto1 values(10, 'Ö ä ? Ü' );
    commit ;
    select * from toto1 where id=10;
     
            ID TEXTE
    ---------- --------------------------------------------------
            10 Ö ä ? Ü
    Je sélectionne la ligne que j'ai insérée, et j'ai la même chose...

    Maintenant, je fais la même chose sous SQL*Worksheet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into toto1 values(11, 'Ö ä € Ü' );
    commit ;
    select * from toto1 where id=11;
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            ID TEXTE
    ---------- --------------------------------------------------
            11 Ö ä € Ü
    Et pourtant, je part de la même requête. Mais d'un coté, le client "dos" fait déjà une première conversion dans un jeu de caractères qu'il connait, et de l'autre, l'appli java Worksheet ne fait pas de conversion car il connait les caractères. Derrière, dans la base de données, c'est stockée en fonction de ce que le client à demandé à stocker.

    Maintenant, je regarde (sous SQL*Plus Worksheet qui arrivera à afficher les caractères) ce que j'ai rentré dans la base de données :

    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
    select id, texte from toto1 where id in (11, 10);
     
            ID TEXTE
    ---------- --------------------------------------------------
            10 ™ „ ? š
            11 Ö ä € Ü
     
    select id, dump(texte) from toto1 where id in (11, 10);
            ID
    ----------
    DUMP(TEXTE)
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            10
    Typ=96 Len=50: 153,32,132,32,63,32,154,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
     
            11
    Typ=96 Len=50: 214,32,228,32,128,32,220,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
    Et sous SQL*Plus sous dos :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    select id, texte from toto1 where id in (11, 10);
     
            ID TEXTE
    ---------- --------------------------------------------------
            10 Ö ä ? Ü
            11 Í õ Ç ▄
     
    select id, dump(texte) from toto1 where id in (11, 10);
            ID
    ----------
    DUMP(TEXTE)
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    ----------------------------------------
            10
    Typ=96 Len=50: 153,32,132,32,63,32,154,32,32,32,32,32,32,32,32,32,32,32,32,32,32
    ,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,3
    2,32,32
     
            11
    Typ=96 Len=50: 214,32,228,32,128,32,220,32,32,32,32,32,32,32,32,32,32,32,32,32,3
    2,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
    32,32,32
    J'ai donc eu le droit à une conversion de la part de SQL*Plus via dos, mais pas depuis SQL*Plus via Worksheet. Cela est du à la conversion de la console dos à l'affichage.

    Bon, dans le cas d'une appli web, la conversion à l'affichage ne se fait pas, parce que l'appli Web connait les accents (pas comme dos dans certains cas...)

    La conversion se fait donc forcément au niveau du NLS_LANG de la base ou du client. Dans le cas présent au vu des paramètres NLS de la base, elle reconnait bien les accents à ma connaissance. D'où l'hypothèse de la conversion NLS (oracle donc) entre le client et la base.

    EDIT : Tiens, j'ai perdu le caractère Euro dans l'explication sur les conversions dues au client applicatif avant celles dûes aux client Oracle

  13. #13
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    J'aurais plutôt penché pour un problème de characterset (d'un côté 7bits de l'autre 8...), c'est souvent le cas quand il s'agit d'un problème d'accents, mais peut-être que je me trompe.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  14. #14
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    Il est en AL16UTF16 au niveau de sa base de données d'après les informations sur nls_database_parameters qu'il a donné. Donc la base est normalement sensée pourvoir stocker les caractères accentués

    Et dans son cas, on a bien une conversion de caractères, vu que la base restitue autre chose que ce qu'il a rentré.

    Par contre, il peut aussi y avoir des soucis si on fait des copier/coller depuis Word, car on a encore un character set différent (WE8MSWIN1252) qui est utilisé...

  15. #15
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par CD
    Il est en AL16UTF16 au niveau de sa base de données d'après les informations sur nls_database_parameters qu'il a donné. Donc la base est normalement sensée pourvoir stocker les caractères accentués
    Tout à fait, mais cela ne nous dit pas le characterset qu'il a sur son client

    NB: je crois qu'il y a un malentendu : je suis d'accord sur le fait que le problème vient du client, mon premier post répondait à VinceTlse (le nls_lang american prend en compte des accents) le second à ducho (car je trouvais se généralisation un peu "hâtive" pour quelqu'un qui lirait le post).
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  16. #16
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    Oui, au temps pour moi alors

  17. #17
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 58
    Points : 38
    Points
    38
    Par défaut
    Salut

    est ce qu'on ne peut pas modifier les parametres suivants dans le serveurs base de donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PARAMETER                                                        VALUE
    ---------------------------------------------------------------- ----------------------------------------------------------------
    NLS_LANGUAGE                                                     AMERICAN
    NLS_TERRITORY                                                    AMERICA
    pour que le serveur supporte definitivement les caracteres accentués.


  18. #18
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    Là justement, ton serveur suppporte les caractères accentués. C'est entre ton client Oracle et ton serveur Oracle qu'il y a un souci. Le langage entre ton client et ton serveur implique une conversion, et converti donc tes "é" en "e".

    Les paramètres fournis dans la vue nls_database_parameters sont fixés à la création de la base, on ne peut les changer.

    Depuis la machine où se trouve le serveur Web, est-il possible de faire les commandes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from nls_instance_parameters;
    select * from nls_session_parameters;

  19. #19
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 58
    Points : 38
    Points
    38
    Par défaut
    mais chez mon serveur web, je ne peux pas executer cette requette car je n'ai pas le client Oracle dedans. je programme avec JSP et j'accede aux données directement dans mon serveur de donnée

    Merci

  20. #20
    CD
    CD est déconnecté
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 151
    Points
    151
    Par défaut
    Ca doit être ton driver JSP qui fait la conversion...

    Si tu ouvres une session sql et que tu insères une ligne avec un accent, cela doit marcher, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create table table_test (texte char(10));
    insert into table_test values('éèà');
    select * from table_test;

Discussions similaires

  1. Problème afin de récupérer des données au chargement
    Par LeLapinVengeur dans le forum Struts 1
    Réponses: 10
    Dernier message: 07/12/2006, 08h33
  2. Réponses: 9
    Dernier message: 05/10/2006, 12h45
  3. Problème awk pour récuperer des champs
    Par ab_2006 dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 21/09/2006, 09h36
  4. [HTML][FORMULAIRE] Probleme dans la récupération des données
    Par baddounet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 15/08/2005, 18h51
  5. [TP]Problème dans la gestion des touches d'un tetris
    Par Guile0 dans le forum Turbo Pascal
    Réponses: 18
    Dernier message: 31/01/2005, 22h40

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