IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Fabien Celaia

[Actualité] Oracle : Import UTF8 d'une base non-UTF8

Noter ce billet
par , 12/06/2017 à 10h45 (787 Affichages)
Comme la plupart des éditeurs de base de données, Oracle pousse ses clients à passer en Unicode.
Ce passage ne va pas sans heurt : c'est souvent loirs de ce passage qu'on se rend compte qu'une la configuration cliente de NLS_LANG n'était pas adéquate... et la volumétrie requise pour de l'Unicode est bien plus importante que celle des jeux de caractères précédents.

Il vaut bien comprendre que l'Unicode est un jeu de caractères dont les caractères sont codés sur une taille variable...

Donc la plupart de vos fonctions basées sur du traitement de chaînes devront être revues...

L'autre problème réside dans le fait que la plupart des moteurs utilisent par défaut un NLS_LENGTH_SEMANTICS à 'BYTE'. En d'autres termes, si vous avez créé des colonnes de type VARCHAR2(n), le n ne correspond pas au nombre de caractères maximaux pour votre chaîne, mais au nombre de BYTES maximaux... pas de souci jusqu'alors pour la plupart de vos chaînes car 1 BYTE = 1 caractère... mais plus en UTF !

Il faut donc avant toute chose modifier vos tables actuelles en corrigeant ce NLS_LENGTH_SEMANTICS à CHAR !

Modifier le schéma source avant l'export
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
select 'ALTER TABLE '||c.owner||'.'||c.table_name||' MODIFY "'|| c.column_name||'" '||c.data_type||'('||c.data_length||' CHAR);' 
from dba_tab_columns c 
inner join dba_tables ton c.owner=T.OWNER and c.table_name=t.table_name
where c.owner = '&MonSchema' 
and c.data_type like '%CHAR%'
and c.data_type not like 'N%' 
and char_used<>'C';
S'assurer que le type sémantique soit à CHAR par défaut

Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
show parameter nls_length_semantics
Au besoin, corriger
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
alter system set nls_length_semantics='CHAR' scope=BOTH sid='*' ;

Lorsque ces étapes sont réglées, procéder au expdp / impdp qui ne devraient dès lors plus causer de problème...

Envoyer le billet « Oracle : Import UTF8 d'une base non-UTF8 » dans le blog Viadeo Envoyer le billet « Oracle : Import UTF8 d'une base non-UTF8 » dans le blog Twitter Envoyer le billet « Oracle : Import UTF8 d'une base non-UTF8 » dans le blog Google Envoyer le billet « Oracle : Import UTF8 d'une base non-UTF8 » dans le blog Facebook Envoyer le billet « Oracle : Import UTF8 d'une base non-UTF8 » dans le blog Digg Envoyer le billet « Oracle : Import UTF8 d'une base non-UTF8 » dans le blog Delicious Envoyer le billet « Oracle : Import UTF8 d'une base non-UTF8 » dans le blog MySpace Envoyer le billet « Oracle : Import UTF8 d'une base non-UTF8 » dans le blog Yahoo

Mis à jour 29/07/2018 à 17h59 par LittleWhite (Coloration du code)

Catégories
SGBD , Oracle

Commentaires