1 votes

Comment transporter des données entre différents encodages de bases de données ?

Nous avons une base de données oracle qui contient des caractères chinois traditionnels et anglais, et l'environnement est :

PARAMETER   VALUE
NLS_LANGUAGE    AMERICAN
NLS_TERRITORY   AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS  .,
NLS_CHARACTERSET    WE8PC850
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE   AMERICAN
NLS_SORT    BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT  HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY   $
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET  UTF8
NLS_RDBMS_VERSION   9.2.0.4.0

Et j'exporte toutes les données de cette base vers un fichier *.sql en encodage "ansi", et lorsque je l'ouvre sur le même ordinateur, tous les caractères chinois sont corrompus.

Et quand je l'importe dans un autre oracle et que l'environnement est :

> NLS_LANGUAGE|AMERICAN
> NLS_TERRITORY|AMERICA NLS_CURRENCY|$
> NLS_ISO_CURRENCY|AMERICA
> NLS_NUMERIC_CHARACTERS|.,
> NLS_CHARACTERSET|WE8MSWIN1252
> NLS_CALENDAR|GREGORIAN
> NLS_DATE_FORMAT|DD-MON-RR
> NLS_DATE_LANGUAGE|AMERICAN
> NLS_SORT|BINARY
> NLS_TIME_FORMAT|HH.MI.SSXFF AM
> NLS_TIMESTAMP_FORMAT|DD-MON-RR
> HH.MI.SSXFF AM
> NLS_TIME_TZ_FORMAT|HH.MI.SSXFF AM TZR
> NLS_TIMESTAMP_TZ_FORMAT|DD-MON-RR
> HH.MI.SSXFF AM TZR NLS_DUAL_CURRENCY|$
> NLS_COMP|BINARY
> NLS_LENGTH_SEMANTICS|BYTE
> NLS_NCHAR_CONV_EXCP|FALSE
> NLS_NCHAR_CHARACTERSET|AL16UTF16
> NLS_RDBMS_VERSION|10.2.0.1.0

Tous les caractères chinois sont encore corrompus. Quelqu'un peut-il me donner des conseils ?

Et j'ai encore un autre problème, pourquoi parfois nous pouvons sauvegarder le "chinois traditionnel" ou le "chinois simplifié" dans un fichier texte avec un encodage "ANSI", et les caractères ne seront pas corrompus. Mais parfois, ils le seront... Pourquoi ? Quelqu'un peut-il expliquer toutes ces choses étranges ?

Merci d'avance !

0voto

Vincent Malgrat Points 42899

La raison pour laquelle les caractères chinois sont "corrompus" est simplement qu'ils sont absents du jeu de caractères "ANSI" (Windows-1252). Ce jeu de caractères ne comprend que les caractères latins.

Par chance, vous pouvez parfois les faire reconnaître par certaines applications parce que certaines applications sont assez intelligentes pour comprendre que vous avez utilisé le mauvais jeu de caractères (c'est-à-dire qu'elles devinent que vous vous êtes trompé, c'est le cas de notepad par exemple). Dans votre cas cependant, vous devriez soit :

  • utiliser un jeu de caractères qui inclut les caractères chinois, c'est-à-dire : UTF-8,
  • configuration de votre application client pour utiliser un jeu de caractères qui inclut les caractères chinois ( NLS_LANG=AMERICAN_AMERICA.UTF8 ) et utiliser un utilitaire qui fait le travail à votre place (SQL*Loader, liaison avec la base de données...).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X