Bonjour,

J'ai des problèmes de caractères accentués dans des champs de type CLOG! et je recherche de l'aide pour trouver une explication aux phénomènes que j'observe sans comprendre

Mon environnement :
- Serveur Oracle 9i sous UNIX (initialement sous Oracle 8 mais migré récemment en 9i)
- Client Oracle 9i sous Windows

Pour info :
  • NLS_LANGUAGE = AMERICAN
    NLS_CHARACTERSET = WE8MSWIN1252
    NLS_NCHAR_CHARACTERSET = AL16UTF16
    NLS_SAVED_NCHAR_CS = WE8MSWIN1252
    NLS_NCHAR_CONV_EXCP = FALSE

Il y a un an la table suivante a été créée (à l’époque sous Oracle 8 et vraisemblablement avec un jeu de caractères différent, mais je ne sais pas lequel)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
CREATE TABLE GraphSeries (
	ItemId				NUMBER (12)	 NOT NULL ,
…
	DataBaseID			NUMBER (12) NULL ,
	EquationOrFilter	CLOB NULL , 
	IsPrimaryX			NUMBER (5) DEFAULT 0 NOT NULL ,
…
	Permissions		VARCHAR2 (500) NULL , 
	PRIMARY KEY ( ItemId ) ) ;
Quelques jours après la création de cette table le jeu de caractères de la base a été changé pour aboutir à la configuration d’aujourd’hui.

Puis la table a été peuplée. Elle est peuplée via une application .NET pour lequel je n’ai pas de détail.
Via l’application en question je remplis notamment le champ EquationOrFilter qui est de type CLOB et qui me pose problème. Certain des enregistrements comportent des caractères accentués.

Par example
Code : Sélectionner tout - Visualiser dans une fenêtre à part
select ItemId,EquationorFilter from GRAPHSERIES where Itemid=9614;
donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
   ITEMID EQUATIONORFILTER
---------- --------------------------------------------------------------------------------
      9614 ééàà
Ce résultat me convient : j’obtiens bien ce que j’ai saisi via mon application.

Le problème commence lorsque je passe la commande suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
declare o CLOB;
BEGIN
select EQUATIONORFILTER into o from GRAPHSERIES where Itemid=9614;
END;
/
car le résultat est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
ERREUR à la ligne 3 :
ORA-06550: line 3, column 8:
PL/SQL: ORA-12704: character set mismatch
ORA-06550: line 3, column 1:
PL/SQL: SQL Statement ignored
Mon premier problème est que je ne comprends pas pourquoi j’ai ce message d’erreur.

Passons au second problème :

Si je lance la commande
Code : Sélectionner tout - Visualiser dans une fenêtre à part
UPDATE GRAPHSERIES SET EQUATIONORFILTER= 'abcàéè' where Itemid=9614;
Puis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
select ItemId,EquationorFilter from GRAPHSERIES where Itemid=9614;
Le résultat est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
    ITEMID EQUATIONORFILTER
---------- --------------------------------------------------------------------------------
      9614 abcaee
Je n’ai pas mes accents !!

Pourquoi ?

Je passe alors à mon 3eme problème :
J’ai recréé une autre table sur le même modèle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
CREATE TABLE opi (
	ItemId				NUMBER (12)	 NOT NULL ,
…
	DataBaseID			NUMBER (12) NULL ,
	EquationOrFilter	CLOB NULL , 
	IsPrimaryX			NUMBER (5) DEFAULT 0 NOT NULL ,
…
	Permissions		VARCHAR2 (500) NULL , 
	PRIMARY KEY ( ItemId ) ) ;
J’ai ajouté un enregistrement, puis j’ai effectué les mêmes manipulation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
UPDATE opi SET EQUATIONORFILTER= 'abcàéè' where Itemid=1;
Puis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
select ItemId,EQUATIONORFILTER from opi where Itemid=1;
Résultat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
    ITEMID EQUATIONORFILTER
---------- --------------------------------------------------------------------------------
         1 abcàéè
Là j’ai bien mes accents!
Pourquoi dans le cas précédent je n’ai pas mes accents alors que là je les ai !

La seul différence entre les 2 tables (enfin pour moi) c’est que la première à été créé sous Oracle 8 et avec un jeu de caractère qui à l’époque était différent.