Corriger les caractères avec un point de code incohérent avec le jeu de caractères de la base de données

Une valeur incorrecte de la variable NLS_LANG peut entraîner le stockage d’un caractère avec un point de code incohérent avec le jeu de caractères de la base de données.
Cet article présente une méthode pour corriger les données non valide.

Si la variable NLS_LANG ne correspond pas au code page du client mais correspond à celui de la base, Oracle pense que la conversion est inutile et des caractères stockés avec un code point non valide. Pour que le caractère soit converti dans le jeu de caractère de la base de données, il faut que le NLS_LANG du client soit différent.
Le principe est d’utiliser les fonctions ASCIISTR et UNISTR :
– ASCIISTR : retourne une chaine de caractères contenant les numéros du code ASCII de chacun des caractères d’une chaine de caractères spécifié. Les caractères non-ASCII sont convertis sous la forme \xxxx, où xxx représente le code UTF-16.
– UNISTR : est l’inverse de la fonction ASCIISTR et transforme un paramètre Unicode pour retourner une information codée dans le jeu de caractères national de la base.
Par exemple:

SELECT UNISTR('abc0e50f10f6') FROM DUAL;
UNISTR
------
abcåñö
SELECT ASCIISTR('ABÄCDE') FROM DUAL;
ASCIISTR
----------
AB\00C4CDE

Pour corriger une colonne qui contient des valeurs incorrectes, on peut utiliser le type d’instruction suivante :

UPDATE 
SET     = UNISTR(REPLACE(ASCIISTR(), ‘', ''))
WHERE  ASCIISTR() != 
AND    ASCIISTR() LIKE '%\';
COMMIT;