Etonnamment, le jeu de caractères de la base n'a aucune importance.
Qu'il soit X ou Y, peu importe, ce qui est décisif, c'est de configurer correctement la session CLIENTE.
Je fais l'hypothèse que vos données sont correctes en base.
Car si ce n'est pas le cas, et qu'elles ont été enregistrées avec un mauvais transcodage de caractères, vous n'arriverez probablement pas à les restituer sans "déformation".
Il faut déterminer le jeu de caractères de votre client.
Sous Linux, la commande "locale" vous indique le paramétrage en vigueur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| locale
LANG=fr_FR.UTF-8
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL= |
Ici, il faut donc indiquer au serveur Oracle que les caractères qu'on échange avec lui seront codés en UTF-8.
Charge à lui de faire la conversion correcte en fonction du jeu de caractères de la base, mais ce qu'il lui faut, c'est savoir quelle "langue" parle le client.
C'est la variable NLS_LANG qui permet de déclarer au serveur le jeu de caractères que l'on utilise ; cette information est transmise lors de la connexion.
Par conséquent, on fait la déclaration suivante avant de lancer SQL*Plus :
export NLS_LANG=FRENCH_FRANCE.UTF8
Ce principe est à adapter selon la valeur LANG retournée par la commande "locale".
Enfin, pourquoi ai-je mis UTF8 dans NLS_LANG, et non UTF-8 comme le renvoie "locale" ?
Parce qu'Oracle a sa propre nomenclature des jeux de caractères.
Il faut donc rechercher le nom du jeu de caractères Oracle correspondant à celui de votre session OS.
1 2 3
| select * from V$NLS_VALID_VALUES
where parameter='CHARACTERSET'
order by value; |
Partager