OVH Cloud OVH Cloud

DBD::Oracle et la variable NLS_LANG

9 réponses
Avatar
Srand
J'ai 2 comportements differents avec les variables positionnees.
La seule difference est bien sur le client utilise :

Client SQLPLUS :
---------------------
export NLS_LANG=FRENCH_FRANCE.UTF8
export ORACLE_SID=TEST
sqlplus user/passwd
select x.body.getCLOBVal() FROM tableA x;

RESULTAT :
-------------
<?xml version="1.0" encoding="UTF-8"?>
<CONTENT>
<AUTH>
<PASS>test</PASS>
<UA>NORAA v1.0</UA>
<LOGIN>test</LOGIN>
</AUTH>
</CONTENT>

Client DBD::Oracle :
---------------------
use DBI;
$ENV{NLS_LANG}='FRENCH_FRANCE.UTF8';
my ($dbh,@mo);
eval
{
$dbh=
DBI->connect('dbi:Oracle:host=localhost;sid=TEST','user','passwd',{
RaiseError => 1, AutoCommit => 1}) || die $!;
print Dumper [$dbh->ora_nls_parameters()];
# Utilisation des XMLType
$dbh->{LongReadLen} = 5242880;
$dbh->{LongTruncOk} = 0;
@mo=@{$dbh->selectall_arrayref("select x.body.getCLOBVal() FROM
tableA x ")};
};
if($@)
{ print 'Acces a la base non disponible'.$/ }
else
{
for my $moxml (@mo)
{
print Dumper $moxml;last
}
}

RESULTAT :
-------------
<?xml version="1.0" encoding="WINDOWS-1252"?>
<CONTENT>
<AUTH>
<PASS>test</PASS>
<UA>NORAA v1.0</UA>
<LOGIN>test</LOGIN>
</AUTH>
</CONTENT>

Pourquoi ai-je une difference au niveau de l'encoding

9 réponses

Avatar
Paul Gaborit
À (at) 3 Oct 2006 05:03:56 -0700,
"Srand" écrivait (wrote):
J'ai 2 comportements differents avec les variables positionnees.
La seule difference est bien sur le client utilise :


Ce n'est pas vraiment la seule différence. En tous cas, à mon avis, ça
n'a rien à voir avec Perl, DBI ou même DBD::Oracle...

Peut-être que la discussion suivante vous aidera :

<http://forums.oracle.com/forums/thread.jspa?messageID27000>


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Srand

À (at) 3 Oct 2006 05:03:56 -0700,
"Srand" écrivait (wrote):
J'ai 2 comportements differents avec les variables positionnees.
La seule difference est bien sur le client utilise :


Ce n'est pas vraiment la seule différence. En tous cas, à mon avis, ça
n'a rien à voir avec Perl, DBI ou même DBD::Oracle...

Peut-être que la discussion suivante vous aidera :

<http://forums.oracle.com/forums/thread.jspa?messageID27000>

Desole, mais je persiste. D'apres moi, cela a bien a voir avec

DBD::Oracle. Le thread ouvert sur le forum d'Oracle discute de la
maniere a operer pour recuperer la chaine dans le bon encodage en
s'appuyant sur la variable NLS_LANG, ce qui devrait etre le meme cas
pour DBD::Oracle comme le dit la doc. De plus je ne peux pas utiliser
le type xmltype lors de la selection car ce type n'est pas supporte par
le module.


Avatar
Srand

À (at) 3 Oct 2006 05:03:56 -0700,
"Srand" écrivait (wrote):
J'ai 2 comportements differents avec les variables positionnees.
La seule difference est bien sur le client utilise :


Ce n'est pas vraiment la seule différence. En tous cas, à mon avis, ça
n'a rien à voir avec Perl, DBI ou même DBD::Oracle...

Peut-être que la discussion suivante vous aidera :

<http://forums.oracle.com/forums/thread.jspa?messageID27000>

Desole, mais je persiste. D'apres moi, cela a bien a voir avec

DBD::Oracle. Le thread ouvert sur le forum d'Oracle discute de la
maniere a operer pour recuperer la chaine dans le bon encodage en
s'appuyant sur la variable NLS_LANG, ce qui devrait etre le meme cas
pour DBD::Oracle comme le dit la doc. De plus je ne peux pas utiliser
le type xmltype lors de la selection car ce type n'est pas supporte par
le module.


Avatar
Paul Gaborit
À (at) 3 Oct 2006 05:47:25 -0700,
"Srand" écrivait (wrote):
Desole, mais je persiste. D'apres moi, cela a bien a voir avec
DBD::Oracle. Le thread ouvert sur le forum d'Oracle discute de la
maniere a operer pour recuperer la chaine dans le bon encodage en
s'appuyant sur la variable NLS_LANG, ce qui devrait etre le meme cas
pour DBD::Oracle comme le dit la doc. De plus je ne peux pas utiliser
le type xmltype lors de la selection car ce type n'est pas supporte par
le module.


Puisque vous semblez sûr que le bug vient de DBD::Oracle. Faites des
tests en découpant le problème en sous-problèmes (diviser pour mieux
régner).

Par exemple, positionnez juste NLS_LANG sur UTF8 (ou AL32UTF8 d'après
ce que dit le module mais je n'ai pas compris tout le détail) et
faites une requête SQL classique (sans XML) pour vérifier si
l'encodage se fait bien.

Dans mon souvenir, cela devrait marcher puisque je l'avais testé (mais
pas avec les versions récentes du module et d'Oracle). Si même cela ne
marche pas alors il y a effectivement un bug mais alors un très gros
car nombreux sont ceux qui utilisent Oracle avec de l'UTF-8.

Sinon, le bug est localisé sur la production de XML (ce qu'il me
semble).. Et là, je ne peux pas vous aider car je n'ai pas de versions
récentes d'Oracle sous la main.

Au fait, quelles versions d'Oracle et de DBD::Oracle utilisez-vous ?


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Emmanuel Florac
Le Tue, 03 Oct 2006 05:03:56 -0700, Srand a écrit :

export NLS_LANG=FRENCH_FRANCE.UTF8


Essayez "french_france.UTF8".
En tout cas c'est ce qui est dans ma doc... Et "ça marche pour moi".

--
In girum imus nocte ecce et consumimur igni

Avatar
Srand

À (at) 3 Oct 2006 05:47:25 -0700,
"Srand" écrivait (wrote):
Desole, mais je persiste. D'apres moi, cela a bien a voir avec
DBD::Oracle. Le thread ouvert sur le forum d'Oracle discute de la
maniere a operer pour recuperer la chaine dans le bon encodage en
s'appuyant sur la variable NLS_LANG, ce qui devrait etre le meme cas
pour DBD::Oracle comme le dit la doc. De plus je ne peux pas utiliser
le type xmltype lors de la selection car ce type n'est pas supporte par
le module.


Puisque vous semblez sûr que le bug vient de DBD::Oracle. Faites des
tests en découpant le problème en sous-problèmes (diviser pour mieux
régner).

Par exemple, positionnez juste NLS_LANG sur UTF8 (ou AL32UTF8 d'après
ce que dit le module mais je n'ai pas compris tout le détail) et
faites une requête SQL classique (sans XML) pour vérifier si
l'encodage se fait bien.
Déjà testé :-(


Dans mon souvenir, cela devrait marcher puisque je l'avais testé (mais
pas avec les versions récentes du module et d'Oracle). Si même cela ne
marche pas alors il y a effectivement un bug mais alors un très gros
car nombreux sont ceux qui utilisent Oracle avec de l'UTF-8.

Sinon, le bug est localisé sur la production de XML (ce qu'il me
semble).. Et là, je ne peux pas vous aider car je n'ai pas de versions
récentes d'Oracle sous la main.

Au fait, quelles versions d'Oracle et de DBD::Oracle utilisez-vous ?
10.2.0.1.0 Express Edition avec le module DBD::Oracle version 1.18a



--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>



Avatar
Paul Gaborit
À (at) 4 Oct 2006 01:36:05 -0700,
"Srand" écrivait (wrote):
Par exemple, positionnez juste NLS_LANG sur UTF8 (ou AL32UTF8 d'après
ce que dit le module mais je n'ai pas compris tout le détail) et
faites une requête SQL classique (sans XML) pour vérifier si
l'encodage se fait bien.
Déjà testé :-(



Et alors ? Le résultat fut positif ? Négatif ? Si le bug se manifeste,
c'est donc que ça n'a pas de lien avec la génération du XML...
Et donc, la réponse d'E.Florac est peut-être une bonne piste ?!?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Srand


export NLS_LANG=FRENCH_FRANCE.UTF8


Essayez "french_france.UTF8".
En tout cas c'est ce qui est dans ma doc... Et "ça marche pour moi".

--
In girum imus nocte ecce et consumimur igni


Testé et ne fonctionne pas :-(


Avatar
Emmanuel Florac
Le Thu, 05 Oct 2006 06:48:57 -0700, Srand a écrit :


Testé et ne fonctionne pas :-(


Sur quelle plate-forme tourne Oracle, et sur quelle plate-forme tourne
Perl? Et quelles versions d'Oracle, de Perl, de DBI et de DBD::Oracle?

--
entia non sont multiplicanda praeter necessitatem.
John Ponce of Cork.