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 :

Soucis de NLS_LANG


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 9
    Par défaut Soucis de NLS_LANG
    Bonjour,

    Je poste sur ce forum le début de ma conversation avec Fadace, ayant un problème de conversion de caractères que je ne parviens pas à résoudre malgré les explications du tutoriel.

    Voici le contexte :

    - J'ai un serveur Win 2k avec easyphp 1.8, un site en php et un client oracle, dont le charset en base de registre est FRENCH_FRANCE.WE8MSWIN1252
    - J'ai une base de données oracle sous linux, qui est installée en AMERICAN_AMERICA.WE8ISO8859P1

    => quand je saisie certains caractères spéciaux (genre euro, le caractère 3pts de word "…", le "œ", etc.) ceux-ci sont stockés dans la base sous forme de "¿" (#0191) au lieu de #164 pour l'euro (qu'il ne sait pas interpréter en WE8ISO8859P1, mais qu'il peut si j'ai bien compris restituer quand php l'interroge). Or lorsque je les récupères (toujours en php), ils apparaissent tous sous la forme de points d'interrogations inversés...

    Application et base ont été changés de serveur et je n'ai plus accès aux précédents, sur lesquels la conversion fonctionnait bien. Il doit donc y avoir un réglage à faire sur le système ou le fichier de configuration d'apache/php, mais impossible pour moi de trouver lequel..

    Quand je fais un getenv() du NLS avec php, j'obtiens bien WE8MSWIN1252, donc celui du serveur, qui est en théorie transmis à oracle pour qu'il fasse la conversion avec son charset à lui.

    Infos complémentaires :
    La base est sous linux 2.6.8, distribution debian 3.1 (sarge).
    La variable shell "LANG" du compte système oracle utilisé pour faire tourner Oracle est positionnée à "POSIX".
    En interne, la variable Oracle nsl_language est positionnée à AMERICAN.

    Merci d'avance pour toute suggestion

    (et n'hésitez pas à y aller en explications, car les jeux de caractères est domaine dans lequel je ne connais vraiment pas grand chose )

  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
    Le caractère Euro n'est pas pris en compte par WE8ISO8859P1
    mais par WE8ISO8859P15: voir les tables Microsoft qui détaille les jeux de caractères ISO sur lesquels Oracle se base: http://www.microsoft.com/globaldev/reference/iso.mspx

    Je vous conseille:
    1. de faire des tests avec SQL*Plus en mode graphique sous Windows en positionnant la variable NLS_LANG dans la fenêtre DOS avant d'appeler sqlplusw.exe pour reproduire les problèmes que vous avez sans passer par PHP.
    2. de migrer votre base en WE8ISO8859P15.

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    il est préférable de migrer en WE8MSWIN1252 qu'en WE8ISO8859P15, parceque WE8MSWIN1252 est un superset de WE8ISO8859P1

    Note 264294.1 :
    Choosing from WE8ISO8859P1, WE8ISO8859P15 or WE8MSWIN1252 as db character set

    c'est vrai que d'utiliser un characterset Microsoft sous Linux/Unix peut poser des problèmes éthiques , mais sinon c'est ce que je conseille

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 9
    Par défaut
    Bonjour et merci pour ces réponses !

    La migration est effectivement une des options que j'envisage, mais comme ça ne se fait généralement pas sans problème, je la garde à défaut de mieux.

    Ce que je cherche à faire dans un premier temps, c'est de retrouver la configuration du serveur précédent. En effet, sur ce dernier, avec la même base en WE8ISO8859P1, les caractères euros et autres étaient correctement restitués. Je ne dis pas qu'ils étaient bien stockés et il y avait alors déjà des "¿" dans sqlplus, mais la conversion se faisait bien avec php dans un sens comme dans l'autre... c'est cette configuration que j'essaie de retrouver avant de commencer à envisager des migrations

  5. #5
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    Malgré Metalink, je ne partage pas l'avis général de prendre le characterset Win pour un serveur Linux..., mais par contre, celui d'éviter le ISOP1...

    Si avec un ISOP1, vous aviez effectivement un retour dans PHP d'un €, c'est que vous aviez déjà une double erreur de conversion et que le caractère en question était mal géré dans la base (puiqu'en P1, il n'y a pas de €) bien qu'il apparaisse correctement en retour.

    En résumé, vous avez maintenant :

    Sur le serveur Linux : jeu de caractère natif = iso_1 (je suppose ?)
    Sur le serveur Oracle : jeu de caractère natif = AMERICAN_AMERICA.WE8ISO8859P1
    Sur le client PHP : jeu de caractère natif = ANSI-Win
    Sur le client Oracle : jeu de caractère natif = FRENCH_FRANCE.WE8MSWIN1252

    Du moment que php retourne bien le jeu de caractère de Windows, on peut dire alors que votre configuration cliente est correcte. Pour vous en assurer, essayez de retourner via PHP l'output d'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM NLS_SESSION_PARAMETERS
    Ensuite, via sqlplus sur Linux, effectuez la même opération pour bien déterminer ce que vous avez.

    En dernier lieu, retournez-nous un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from NLS_DATABASE_PARAMETERS
    Pour retrouver ce que vous aviez à la base, essayez d'utiliser le même NLS_LANG sur le client que sur le serveur. ce faisant, vous pousserez le servezr à ne pas faire de conversion... mais ce n'est pas la solution à envisager en finale.
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    je tiens à souligner que je conseille plutôt de migrer de WE8ISO8859P1 vers WE8MSWIN1252 que vers P15, attendu que MSWIN est un superset binaire de P1, donc probablement pas de problème de migration

    Pour une nouvelle base, il te faut considérer AL32UTF8, le set universel

Discussions similaires

  1. [langage] ptit souci de syntaxe
    Par marouanitos dans le forum Langage
    Réponses: 2
    Dernier message: 26/09/2003, 10h28
  2. [File et Directory ListBox] Soucis de filtre
    Par Mercilius dans le forum Composants VCL
    Réponses: 8
    Dernier message: 04/04/2003, 16h17
  3. Réponses: 4
    Dernier message: 16/02/2003, 12h16
  4. Réponses: 2
    Dernier message: 03/10/2002, 17h24
  5. character set // Nls_lang
    Par fopicht dans le forum Oracle
    Réponses: 2
    Dernier message: 23/05/2002, 12h04

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