Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Administration
Administration Forum d'entraide sur l'administration du serveur Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/09/2007, 17h31   #1
Membre expérimenté
 
Avatar de Pilru
 
Homme
Dev ASP.NET/jQuery ; Admin ORACLE
Inscription : septembre 2007
Messages : 418
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Dev ASP.NET/jQuery ; Admin ORACLE

Informations forums :
Inscription : septembre 2007
Messages : 418
Points : 531
Points : 531
Par défaut Export/import de 8i ver 9i et perte des accents

Bonjour,

Voici mon problème :

Nous exportont un schema d'un base 8i vers une 9i.
L'export et l'import se passent sans problèmes (pas d'erreurs, ni d'avertissements). Sauf que les lettres avec accent ne sont pas importées dans la 9i.
A la place on y trouve soit des ? inversés, soit d'autres signes. Ceci en fonction du nls_lang utilisé par le client. Mais jamais les accents ne sont affichés.

J'ai essayé de jouer avec la variable d'environnement NLS_LANG au moment de l'export et de l'import. Mais rien n'y fait. Impossible de récupérer les accents.

Voici quelques infos :

BDD source 8i :

* nls_database_parameters :
Code :
1
2
3
4
5
6
7
8
 
PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CHARACTERSET               WE8ISO8859P1
NLS_NCHAR_CHARACTERSET         WE8ISO8859P1
NLS_RDBMS_VERSION              8.1.7.0.0
* nls_session_parameters :
Code :
1
2
3
4
5
6
 
PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   FRENCH
NLS_TERRITORY                  FRANCE
NLS_COMP                       BINARY
BDD cible 9i :

* nls_database_parameters :
Code :
1
2
3
4
5
6
7
8
9
10
 
PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CHARACTERSET               WE8MSWIN1252
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
NLS_RDBMS_VERSION              9.2.0.7.0
* nls_session_parameters :
Code :
1
2
3
4
5
6
7
8
 
PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   FRENCH
NLS_TERRITORY                  FRANCE
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
Le tout fonctionnant sur des serveurs Windows 2003.
L'export et l'import se font par batch dans une console cmd.

Pour l'instant je sèche complètement.
Pilru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2007, 18h56   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Il faut nous donner les 2 valeurs de NLS_LANG:
  • Quelle est la valeur de NLS_LANG pour le code applicatif qui fait les INSERT ou les UPDATE sur les données de la base 8i (Si la partie jeu de caractères NLS_LANG est la même que le jeu de caractères de la base, il y a un risque de "corruption" car Oracle ne fait plus de vérification ou conversion avant de stocker les caractères dans la base) ?
  • Quelle est la valeur de NLS_LANG dans l'environnement où l'affichage est incorrect ?

Essayez de comparer sur les bases 8i et 9i le contenu d'une colonne concernée qui contient un 'é' avec la fonction DUMP SQL:

Code :
SELECT dump(<colonne>, 1017) FROM <table>;
avec par exemple:

Code :
SELECT dump('é', 1017) FROM dual;
Voir aussi le tutoriel NLS.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2007, 10h43   #3
Membre expérimenté
 
Avatar de Pilru
 
Homme
Dev ASP.NET/jQuery ; Admin ORACLE
Inscription : septembre 2007
Messages : 418
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Dev ASP.NET/jQuery ; Admin ORACLE

Informations forums :
Inscription : septembre 2007
Messages : 418
Points : 531
Points : 531
La valeur de NLS_LANG pour que l'affichage soit correct en console est : FRENCH.FRANCE.WE8ISO8859P1.

Les dump sur les 'é' et 'è' sont identique pour les deux BDD, a savoir :

é = 82
è = 8a

L'encodage sur la 8i est correcte :
Code :
Typ=1 Len=13 CharacterSet=WE8ISO8859P1: E,n,v,o,i, ,r,82,p,o,n,s,e
En revanche, une fois la table importée sur la 9i, l'encodage n'est plus le même :
Code :
Typ=1 Len=13 CharacterSet=WE8MSWIN1252: E,n,v,o,i, ,r,bf,p,o,n,s,e
Il y a bien une conversion, mais quand et pourquoi, mystère.
Pilru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2007, 11h04   #4
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
pouvez-vous nous donner les premières lignes des logs d'export et d'import ?
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2007, 11h35   #5
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Dans les 2 jeux de caractères, 'é' et 'è' ont la même représentation binaire d'après les tables 8859-1 et Windows-1252. J'ai également vérifié avec deux bases en 10.2 chacune ayant le bon jeu de caractères::
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> SELECT dump (x, 1017) FROM t;
 
DUMP(X,1017)
--------------------------------------------------------------------------------
 
Typ=1 Len=2 CharacterSet=WE8MSWIN1252: e9,e8
 
SQL> SELECT *  FROM t;
 
X
--------------------------------------------------------------------------------
 
éè
et

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> SELECT  * FROM t;
 
X
--------------------------------------------------------------------------------
 
éè
 
SQL> SELECT dump (x, 1017) FROM t;
 
DUMP(X,1017)
--------------------------------------------------------------------------------
 
Typ=1 Len=2 CharacterSet=WE8ISO8859P1: e9,e8
Cela signifie que dans votre cas les données sont mauvaises dans la base source.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2007, 15h07   #6
Membre expérimenté
 
Avatar de Pilru
 
Homme
Dev ASP.NET/jQuery ; Admin ORACLE
Inscription : septembre 2007
Messages : 418
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Dev ASP.NET/jQuery ; Admin ORACLE

Informations forums :
Inscription : septembre 2007
Messages : 418
Points : 531
Points : 531
Voici :

Export fait avec NLS_LANG=FRENCH_FRANCE.WE8ISO8859P1 (NLS_LANG qui me permet d'avoir les accent lors d'une requête par sqlplus).
Code :
1
2
3
4
Connecté à: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
JServer Release 8.1.7.0.0 - Production
Export fait dans le jeu de car WE8ISO8859P1 et jeu de car NCHAR WE8ISO8859P1
Prêt à exporter les TABLES spécifiées ... via le chemin classique...
Import fait avec NLS_LANG=FRENCH_FRANCE.WE8MSWIN1252
Code :
1
2
3
4
5
6
Connecté à : Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
WITH the Partitioning, OLAP AND Oracle DATA Mining options
JServer Release 9.2.0.7.0 - Production
Fichier d'export créé par EXPORT:V08.01.07 via le chemin classique
import effectué dans le jeu de caractères WE8MSWIN1252 et le jeu NCHAR AL16UTF16
le serveur d'import utilise le jeu de caractères NCHAR WE8ISO8859P1 (conversion possible)
Merci pour votre aide...
Pilru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 11h02   #7
Membre expérimenté
 
Avatar de Pilru
 
Homme
Dev ASP.NET/jQuery ; Admin ORACLE
Inscription : septembre 2007
Messages : 418
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Dev ASP.NET/jQuery ; Admin ORACLE

Informations forums :
Inscription : septembre 2007
Messages : 418
Points : 531
Points : 531
J'ai l'explication :

Dans la table source, les données sont codées en WE8PC850.
Lors d'une requête avec un NLS_LANG=NLS_LANG=FRENCH_FRANCE.WE8ISO8859P1 (characterset correspondant a celui de la BDD), l'affichage est correct puisqu'aucune conversion n'est faite.

Lors de l'export, Oracle pense que les données sont en WE8ISO8859P1, ne fait pas de conversion. Le fichier dump contient donc des donnée codées en WE8PC850.

Lors de l'import, Oracle reconnait le fichier comme ayant été exporté en WE8ISO8859P1 et fait la conversion vers WE8MSWIN1252.

La solution :

Exporter les données avec nls à WE8ISO8859P1.
Modifier le fichier dmp pour qu'Oracle le reconnaisse comme ayant était créé en WE8PC850 (2 octets à modifier).

J'ai testé, ça marche
Pilru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2007, 13h20   #8
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Citation:
Envoyé par Pilru Voir le message
J'ai l'explication :

Dans la table source, les données sont codées en WE8PC850.
Lors d'une requête avec un NLS_LANG=NLS_LANG=FRENCH_FRANCE.WE8ISO8859P1 (characterset correspondant a celui de la BDD), l'affichage est correct puisqu'aucune conversion n'est faite.

Lors de l'export, Oracle pense que les données sont en WE8ISO8859P1, ne fait pas de conversion. Le fichier dump contient donc des donnée codées en WE8PC850.
:
Cela ne correspond pas aux informations données dans votre premier message ! Oracle fait une conversion des données caractère entre le serveur et le client si les jeux de caractères de la base et celui indiqué par NLS_LANG sont différents. C'est justement si les jeux sont les mêmes qu'il y a un risque d'après le Globalization Guide.

Citation:
Envoyé par Pilru Voir le message
La solution :

Exporter les données avec nls à WE8ISO8859P1.
Modifier le fichier dmp pour qu'Oracle le reconnaisse comme ayant était créé en WE8PC850 (2 octets à modifier).

J'ai testé, ça marche :yaisse2
:
Modifier directement un fichier export qui utilise un format binaire (même si on peut afficher certaines parties en ASCII) n'est pas du tout supporté par Oracle.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 09h49   #9
Membre expérimenté
 
Avatar de Pilru
 
Homme
Dev ASP.NET/jQuery ; Admin ORACLE
Inscription : septembre 2007
Messages : 418
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Dev ASP.NET/jQuery ; Admin ORACLE

Informations forums :
Inscription : septembre 2007
Messages : 418
Points : 531
Points : 531
Citation:
Cela ne correspond pas aux informations données dans votre premier message ! Oracle fait une conversion des données caractère entre le serveur et le client si les jeux de caractères de la base et celui indiqué par NLS_LANG sont différents.
Si, ça correspond. Le characterset de la base est WE8ISO8859P1. Est fixant le NLS_LANG à FRENCH_FRANCE.WE8ISO8859P1 sur le client, l'export ne converti pas. Je peux le vérifier par les sorties de la commande d'export et par le contenu du fichier d'export.

Citation:
Modifier directement un fichier export qui utilise un format binaire (même si on peut afficher certaines parties en ASCII) n'est pas du tout supporté par Oracle.
Un éditeur hexadécimal fait l'affaire. J'ai modifiés 2 octets, pas 2 caractères.
Et cela fonctionne très bien.
Pilru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 10h02   #10
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Ce qui est contradictoire c'est ça:

Citation:
Dans la table source, les données sont codées en WE8PC850.
et
Citation:
Typ=1 Len=13 CharacterSet=WE8ISO8859P1: E,n,v,o,i, ,r,82,p,o,n,s,e
et
Citation:
NLS_CHARACTERSET WE8ISO8859P1
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/09/2007, 11h05   #11
Membre expérimenté
 
Avatar de Pilru
 
Homme
Dev ASP.NET/jQuery ; Admin ORACLE
Inscription : septembre 2007
Messages : 418
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Dev ASP.NET/jQuery ; Admin ORACLE

Informations forums :
Inscription : septembre 2007
Messages : 418
Points : 531
Points : 531
Le progiciel doit envoyer les datas en WE8CP850 au serveur et ce dernier pense les recevoir en WE8ISO8859P1.

Ce qui se vérifie avec
Code :
Typ=1 Len=13 CharacterSet=WE8ISO8859P1: E,n,v,o,i, ,r,82,p,o,n,s,e
82 correspondant au é dans la codepage 850.
Pilru est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h19.


 
 
 
 
Partenaires

Hébergement Web