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:
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) donnaitCode:
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ésCode:
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 basesCode:
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 satisfaisanteCode:
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