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 :

[Caractère spéciaux] Pb d'insertion


Sujet :

Oracle

  1. #1
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut [Caractère spéciaux] Pb d'insertion
    Bonjour à tous,

    j'ai un pb byzarre, et je suis loin d'être un expert Oracle...

    J'ai diverses données à crypter dans une base Oracle.

    Par exemple, j'essai d'enregistrer un utilisateur nommé "TOTO", oui, je sais c'est trés original, j'aime beaucoup l'originalité :o)

    Une fois crypté, cela devient "Ÿ¤—",et malheureusement, voila ce qu'il y a dans la base : "¿¤¿".

    Apparemment, Oracle ne "comprend pas" certains caractères, et les remplace par des super beaux point d'interrocation espaniol... Ca aussi c'est original !

    ¿ Y a t'il un expert Oracle dans la salle ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Pouvez-vous nous donner les résultats des requêtes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM v$version
     
    SELECT * FROM nls_database_parameters;
     
    SELECT * FROM nls_session_parameters;
    Pour afficher les codes utilisés par Oracle et le jeu de caractères pour stocker une donnée, utiliser la fonction DUMP comme ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT dump(name) FROM v$database;
    [/quote]

  3. #3
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    D'abbord, merci de m'aider,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * FROM v$version 
     
    BANNER
    ----------------------------------------------------------------
    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    PL/SQL Release 9.2.0.1.0 - Production
    CORE    9.2.0.1.0       Production
    TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
    NLSRTL Version 9.2.0.1.0 - Production
    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
    SELECT * FROM nls_database_parameters;
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   AMERICAN
    NLS_TERRITORY                  AMERICA
    NLS_CURRENCY                   $
    NLS_ISO_CURRENCY               AMERICA
    NLS_NUMERIC_CHARACTERS         .,
    NLS_CHARACTERSET               WE8MSWIN1252
    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
    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
    SELECT * FROM nls_session_parameters;
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_LANGUAGE                   FRENCH
    NLS_TERRITORY                  FRANCE
    NLS_CURRENCY                   F
    NLS_ISO_CURRENCY               FRANCE
    NLS_NUMERIC_CHARACTERS         ,.
    NLS_CALENDAR                   GREGORIAN
    NLS_DATE_FORMAT                DD/MM/RR
    NLS_DATE_LANGUAGE              FRENCH
    NLS_SORT                       FRENCH
    NLS_TIME_FORMAT                HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF
     
    PARAMETER                      VALUE
    ------------------------------ ----------------------------------------
    NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZH:TZM
    NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZH:TZM
    NLS_DUAL_CURRENCY              ¿
    NLS_COMP                       BINARY
    NLS_LENGTH_SEMANTICS           BYTE
    NLS_NCHAR_CONV_EXCP            FALSE

  4. #4
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    J'ai oublié le Dump :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DUMP(NAME)
    --------------------------------------------------------------------------------
    Typ=1 Len=4: 73,83,73,83

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Le résultat de la commande DUMP concerne-t-il la valeur avant cryptage ou après cryptage ?
    Il nous faudrait la valeur après cryptage.

    Si Oracle affichie un '?', cela signifie sans doute que le caractère converti n'existe pas dans l'environnement NLS client (NLS_LANGUAGE de nls_session_parameters).

    Le jeu de caractères WE8MSWIN1252 comprend des caractères qui ne font pas partie de des caractères français usuels: si vous voulez que votre résultat soit affichable il faut:
    - soit votre algorithme pour interdire certaines plages si vous voulez qu'il soit affichable en français
    - sinon, à l'aide de la commande DUMP, trouver le code binaire du caractère, en déduire le caractère, trouver le language auquel il appartient et enfin exécuter la commande 'ALTER SESSION SET LANGUAGE=<langue>' qui convient: alors seulement la commande SELECT affichera le caractère correctement.

  6. #6
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    En fait, mon client Oracle est en version 8.1, alors que le serveur est en 9, je vais donc regarder ce que vaut le champ NLS_LANGUAGE sur le client oracle 9, et peu être que je pourrais régler comme ça le problème. Car avec un client 9, cela fonctionne !

    En tous cas merci beaucoup.

  7. #7
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    Voici ce que me renvoi la requête sur le client en version 9 :

    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
    37
    38
    39
    40
    41
    42
    43
    PARAMETER                      VALUE
     
    ------------------------------ ----------------------------------------
     
    NLS_LANGUAGE                   FRENCH
     
    NLS_TERRITORY                  FRANCE
     
    NLS_CURRENCY                   €
     
    NLS_ISO_CURRENCY               FRANCE
     
    NLS_NUMERIC_CHARACTERS         ,.
     
    NLS_CALENDAR                   GREGORIAN
     
    NLS_DATE_FORMAT                DD/MM/RR
     
    NLS_DATE_LANGUAGE              FRENCH
     
    NLS_SORT                       FRENCH
     
    NLS_TIME_FORMAT                HH24:MI:SSXFF
     
    NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF
     
     
     
    PARAMETER                      VALUE
     
    ------------------------------ ----------------------------------------
     
    NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR
     
    NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZR
     
    NLS_DUAL_CURRENCY              €
     
    NLS_COMP                       BINARY
     
    NLS_LENGTH_SEMANTICS           BYTE
     
    NLS_NCHAR_CONV_EXCP            FALSE
    Le NLS_CURRENCY est en fait le symbole de l'euros, mal affiché ici (décidément !)


    Le NLS_LANGUAGE est identique ... Voyez-vous d'ou pourrait alors provenir ce probléme ?

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Est-ce que vous êtes-sûr que les 2 environnements le 8 (celui qui ne marche pas) et le 9 (celui qui marche) utilisent le même environnement NLS ?

    Qu'est-ce qui ne marche pas ?
    - l'affichage côté client
    et/ou
    - le stockage dans la base (à vérifier avec la fonction DUMP)

    Le code qui fait le cryptage s'exécute-il côté client ou côté serveur ?
    Dans quel language est-il écrit ?
    Pouvez-vous mettre une trace dans votre code pour être sûr qu'au moment du cryptage l'environnment NLS est bien celui attendu ?

  9. #9
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    Alors, je crypte coté serveur avec un script d'insertion(ou modification) PHP. Donc la donnée à insérer est déjà crypté, avec les fameux caractères qui s'insère mal dans la base.

    Au niveau de l'affichage, je récupère la donnée crypté, que je décrypte avec un scrypt PHP.

    C'est vraiment au moment de l'insertion qu'il y a un probléme.

    Je vous fais suivre une trace avant insertion, et aprés insertion de l'environnement NLS.

  10. #10
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    AVANT INSERTION

    valeur à enregistrer : TOTO aprés cryptage => Ÿ¤—

    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
    PARAMETER=>VALUES
    NLS_LANGUAGE=>FRENCH
    NLS_TERRITORY=>FRANCE
    NLS_CURRENCY=>F
    NLS_ISO_CURRENCY=>FRANCE
    NLS_NUMERIC_CHARACTERS=>,.
    NLS_CALENDAR=>GREGORIAN
    NLS_DATE_FORMAT=>DD/MM/RR
    NLS_DATE_LANGUAGE=>FRENCH
    NLS_SORT=>FRENCH
    NLS_TIME_FORMAT=>HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT=>DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT=>HH24:MI:SSXFF TZH:TZM
    NLS_TIMESTAMP_TZ_FORMAT=>DD/MM/RR HH24:MI:SSXFF TZH:TZM
    NLS_DUAL_CURRENCY=>¿
    NLS_COMP=>BINARY
    NLS_LENGTH_SEMANTICS=>BYTE
    NLS_NCHAR_CONV_EXCP=>FALSE
    APRES INSERTION

    valeur enregistrée :¿¤¿
    DONC, une fois décrypté => tOTg

    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
    PARAMETER=>VALUES
    NLS_LANGUAGE=>FRENCH
    NLS_TERRITORY=>FRANCE
    NLS_CURRENCY=>F
    NLS_ISO_CURRENCY=>FRANCE
    NLS_NUMERIC_CHARACTERS=>,.
    NLS_CALENDAR=>GREGORIAN
    NLS_DATE_FORMAT=>DD/MM/RR
    NLS_DATE_LANGUAGE=>FRENCH
    NLS_SORT=>FRENCH
    NLS_TIME_FORMAT=>HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT=>DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT=>HH24:MI:SSXFF TZH:TZM
    NLS_TIMESTAMP_TZ_FORMAT=>DD/MM/RR HH24:MI:SSXFF TZH:TZM
    NLS_DUAL_CURRENCY=>¿
    NLS_COMP=>BINARY
    NLS_LENGTH_SEMANTICS=>BYTE
    NLS_NCHAR_CONV_EXCP=>FALSE
    Ca me semble bien identique ...

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    En fait il nous manque une information, c'est de savoir quel est le jeu de caractères utilisé par le client qui fait le cryptage (ce paramètre n'est pas dans NLS_SESSION_PARAMETERS).

    Si le client est sous Windows, il nous faudrait le résultat de
    sous sqlplus
    sinon sous Unix
    echo $NLS_LANG[/code]

    Merci

  12. #12
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    Voila ce que j'ai avec sqlplus ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SP2-0310: impossible d'ouvrir le fichier ".[FRENCH_FRANCE.WE8ISO8859P1]"
    C'est plutot sympathique

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    En fait, c'est normal, c'est une truc de sqlplus pour afficher le paramètre NLS_LANG en entiter.

    Je pense que le problème vient de la différence de jeux de caractères
    entre le client
    WE8ISO8859P1
    et le serveur
    WE8MSWIN1252
    .

    Essayez de définir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set NLS_LANG=FRENCH_FRANCE.WE8MSWIN1252
    au niveau du client qui fait le cryptage.

  14. #14
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    ... au risque de paraître ignorant, j'ai tapé la commande sous sqlplus, mais j'ai un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQL> set NLS_LANG=FRENCH_FRANCE.WE8MSWIN1252
    SP2-0735: option SET inconnue au début de "NLS_LANG=F..."

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    C'est une commande Windows, il faut la taper dans une ligne de commande (cmd.exe) ou mieux la mettre dans un script .bat avant d'appeler le client qui va se connecter à Oracle.

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 138
    Par défaut
    Autrement, un alter session set peut faire l'affaire, directement dans sql*plus.

  17. #17
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Tout ceci est bien joli, mais je crains que ce ne soit qu'un pansement....
    Positionner le NLS_LANG résoudra certaintement le problème des caractères étranges, mais pas le problème de sécurité lié au cryptage....

    Pourquoi souhaitez-vous crypter ? quelle méthode utilisez-vous ?
    Avez-vous jeté un coup d'oeil à http://leoanderson.developpez.com/se...n_oracle/#LV-B ?

  18. #18
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    Alors, aprés avoir éxécuter la commande "set" sous une fenêtre DOS, le résultat est le même.

    Un alter session me dit qu'une option est érroné ou absente.

    Mon principe de cryptage est le suivant :

    - Je ne passe pas par un cryptage Oracle, je crypte les données avant de les insérer via un script PHP, utilisant le mcrypt à l'aide d'un clé unique générer avec la fonction MD5.

    - A l'affichage, je décrypte de la même manière que j'ai crypté.

    Le problème : Aprés cryptage, certain caractère ne sont pas reconnu, et sont remplacé par d'autre. Donc, au moment de décrypter, on ne récupère pas la valeur d'origine.

  19. #19
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Si le cryptage est codé en PHP, il s'exécute dans un serveur web: est-ce que vous avez arrêté/relancé votre serveur web pour être sûr que la le paramètre NLS_LANG a bien été pris en compte par le serveur web ?

    Je pense que c'est la seule façon de faire car je crois que la variable NLS_LANG complète (langage + territoire + jeu de caractères) ne peut être modifiée qu'au niveau de l'environnement système et non par une command ALTER SESSION (ALTER SESSION permet de modifier langage et territoire mais pas le jeu de caractères).

  20. #20
    Membre confirmé Avatar de ashurai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 144
    Par défaut
    Ca marche !

    Alors, comme cela prenait un peu de temps, j'ai désinstallé mon client 8, pour installer un client 9.

    Ensuite, j'ai quand même éxécuter votre commant "set", redémarrer mes serveur, et cela marche enfin.

    Merci beaucoup pour le temps que vous avez passé pour m'aider à resoudre ce problème.

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

Discussions similaires

  1. caractères spéciaux dans un insert, encodage
    Par Dark Ryus dans le forum SQL
    Réponses: 2
    Dernier message: 29/02/2012, 15h24
  2. caractères spéciaux quote ' dans insert
    Par couf35 dans le forum DB2
    Réponses: 1
    Dernier message: 30/04/2009, 18h27
  3. Problème insertion caractères spéciaux
    Par gaet_045 dans le forum Débuter
    Réponses: 3
    Dernier message: 07/07/2006, 14h42
  4. Insert d'un champ caractères spéciaux avec firebird et php
    Par PHILOSOPHE dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 14/05/2005, 11h18
  5. [SQL2]Insertion de caractères spéciaux
    Par willowII dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/10/2004, 15h33

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