Bonjour
J'ai une procédure qui génère un fichier à partir de la lecture d'infos en base. Cette procédure fonctionne bien en v10, mais en V11 (encodage de la base en UTF8), le résulat n'est plus bon et les cacratères accentués sont altérés.
Les informations sont stockées de la manière suivantes :
- NVARCHAR pour la base v11
- VARCHAR pour la V10
La proc (simplifiée donne ceci) :
Le résultat donne alors : il y a juste 2 carrés après le mot "value :"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 CREATE OR REPLACE PROCEDURE test_convert IS FileName VARCHAR2( 100) ; exp_fichier UTL_FILE.FILE_TYPE; ligne VARCHAR2(2000) ; dmp VARCHAR2(2000) ; BEGIN FileName := 'test_convert.txt' ; exp_fichier := UTL_FILE.FOPEN( 'EXPORT_CODE', FileName, 'w' ); -- résultat attendu élève : Typ=1 Len=5: e9,6c,e8,76,65 SELECT CONVERT( NOM,'WE8MSWIN1252'), DUMP(CONVERT( NOM,'WE8MSWIN1252'), 16) INTO ligne, dmp FROM clients WHERE reference = 1917505 ; UTL_FILE.PUT_LINE(exp_fichier, 'Value : ' || ligne ); UTL_FILE.PUT_LINE(exp_fichier, 'Dump : ' || dmp ); -- Vidage du tampon et fermeture du fichier UTL_FILE.FFLUSH(exp_fichier); UTL_FILE.FCLOSE(exp_fichier); END ; / SHOW ERR execute test_convert
Alors que le code de la même procédure en oracle V10 (dans laquelle je n'utilise pas la fonction Convert) donnait
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Value : Dump : Typ=1 Len=5: bf,6c,bf,76,65
On voir nettement une différence sur les valeurs des caratères accentués
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Value : élève Dump : Typ=1 Len=5: e9,6c,e8,76,65
J'ai essayé tout un tas de conversion (ci-dessous : convert utilisé et dump affiché, certains tests sont idiots, mais je voulais juste voir ce que cela donnait, se sont les "convert" 1 et 5 qui m'interessent ) :
Informations sur les bases
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CONVERT( nom, 'WE8MSWIN1252') ==> Typ=1 Len=5: bf,6c,bf,76,65 CONVERT( nom, 'AL16UTF16') ==> Typ=1 Len=10: 0,82,0,6c,0,8a,0,76,0,65 CONVERT( nom, 'UTF8') ==> Typ=1 Len=7: c2,82,6c,c2,8a,76,65 CONVERT( nom, 'WE8ISO8859P15') ==> Typ=1 Len=5: 82,6c,8a,76,65 CONVERT( nom, 'WE8MSWIN1252', 'AL32UTF8') ==> Typ=1 Len=10: 0,bf,0,6c,0,bf,0,76,0,65 CONVERT( nom, 'AL16UTF16', 'AL32UTF8') ==> Typ=1 Len=20: 0,0,ff,fd,0,0,0,6c,0,0,ff,fd,0,0,0,76,0,0,0,65 CONVERT( nom, 'UTF8', 'AL32UTF8') ==> Typ=1 Len=14: 0,ef,bf,bd,0,6c,0,ef,bf,bd,0,76,0,65 CONVERT( nom, 'WE8ISO8859P15', 'AL32UTF8')==> Typ=1 Len=10: 0,bf,0,6c,0,bf,0,76,0,65 CONVERT( nom, 'US7ASCII') ==> Typ=1 Len=5: 3f,6c,3f,76,65
aucune n'est satisfaisante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 param de la base en v10 : (pas d encodage particuliers, que je sache) NLS_CHARACTERSET WE8ISO8859P15 NLS_NCHAR_CHARACTERSET AL16UTF16 param de la base en v11 (encodage en UTF8) NLS_CHARACTERSET AL32UTF8 NLS_NCHAR_CHARACTERSET AL16UTF16
si vous avez un idée, je suis preneur
Merci
Partager