[8,9i][UNIX/WIN] Le Mystère des Characters set dans les CLOB
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:
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:
select ItemId,EquationorFilter from GRAPHSERIES where Itemid=9614;
donne:
Code:
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:
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:
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:
UPDATE GRAPHSERIES SET EQUATIONORFILTER= 'abcàéè' where Itemid=9614;
Puis
Code:
select ItemId,EquationorFilter from GRAPHSERIES where Itemid=9614;
Le résultat est :
Code:
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:
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:
UPDATE opi SET EQUATIONORFILTER= 'abcàéè' where Itemid=1;
Puis
Code:
select ItemId,EQUATIONORFILTER from opi where Itemid=1;
Résultat:
Code:
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.