IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

BDD Unicode, multi-langue, multi-octets ?


Sujet :

Oracle

  1. #1
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut BDD Unicode, multi-langue, multi-octets ?
    Bonjour,

    Je suis développeur Delphi et mon application doit stocker tous les formats de chaines saisies dans les écrans.

    Ca peut être du français, de l'anglais, du russe, du chinois, du polonais, du thailandais, de l'arabe, de l'hebreux, etc.

    J'ai demandé à notre DBA de créer une BDD 11G compatible Unicode et lors de l'install, il a choisit 1 première fois :
    - Utiliser Unicode : AL32UTF8
    Jeu de caractère : UTF8 3.0

    Pour test, j'ai créé une table comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE PHRASE_TEST
    (
      Champ1 Varchar2(1),
      Champ2 NVarchar2(1)
    );
    J'ai fais un INSERT dans cette table pour chaque champ avec un caractère THAI ชั่ : ce champ est saisie dans mon application, on peut très bien le saisir dans le bloc-note ou autre

    Ce caractère est spécial, il est composé d'1 consonne et 2 voyelles :
    ช ั ่

    Je n'arrive pas à insérer ce caractère dans la BDD, avec toad ou sqlplus

    Il me dit que le nombre de caractère dépasse celui du champ.
    Voici l'erreur pour le 1er champ :
    ORA-12899 valeur trop grande pour la colonne
    reelle 9, maximum 1
    Voici l'erreur pour le 2eme champ :
    ORA-12899 valeur trop grande pour la colonne
    reelle 3, maximum 1
    => Le DBA a donc créé une nouvelle BDD, cette fois-ci avec les paramètres suivant :

    - Utiliser Unicode : AL32UTF8
    Jeu de caractère : AL16UTF16

    Toujours le même problème, même message d'erreur

    Comment faire ?
    Merci beaucoup.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR;
    Et/ou créez vos table comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE PHRASE_TEST
    (
      Champ1 Varchar2(1 CHAR),
      Champ2 NVarchar2(1 CHAR)
    );

  3. #3
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut
    On ne peut pas préciser BYTE ou CHAR sur un NVarchar2.

    Lorsque j'applique CHAR sur Varchar2, il a l'air de se comporter comme un NVarchar2.

    Mais toujours le même problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORA-12899 valeur trop grande pour la colonne
    reelle 3, maximum 1
    pour les 2 champs

  4. #4
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Points : 926
    Points
    926
    Par défaut
    Bonjour,

    En fait, tu as toi-même donné la réponse à ton pb :

    Ce caractère est spécial, il est composé d'1 consonne et 2 voyelles :
    ช ั ่
    Si j'ai bien compris, ce "caractère", j'ai envie de dire ce symbole, est en fait une superposition de 3 caractères. C'est bien cela ?

    Dans ce cas, ton champ ne doit pas faire 1, mais 3 caractères Unicode.

    Moi j'ai fait l'essai sur une base 11gR2 ((11.2.0.3.0) en AL32UTF8 / AL16UTF16, et ça marche.

    Attention aussi à gérer côté client ta langue et ton territoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE PHRASE_TEST
    (
      Champ1 Varchar2(3),
      Champ2 NVarchar2(3)
    ) ;
     
    alter session set NLS_LANGUAGE=THAI ;
    alter session set NLS_TERRITORY=THAILAND ;
     
    insert into phrase_test values ('ชั่', 'ชั่') ;
    commit ;
    Voilà ce que j'ai obtenu en requêtant sous Toad :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select champ1, champ2 from phrase_test ;
    CHAMP1    CHAMP2
    ชั่          ชั่

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Specifying Column Lengths for Multilingual Data
    When you use CHAR and VARCHAR2 data types for storing multilingual data, the maximum length specified for each column is, by default, in number of bytes. If the database needs to support Thai, Arabic, or multibyte languages such as Chinese and Japanese, then the maximum lengths of the CHAR, VARCHAR, and VARCHAR2 columns may need to be extended. This is because the number of bytes required to encode these languages in UTF8 or AL32UTF8 may be significantly larger than the number of bytes for encoding English and Western European languages. For example, one Thai character in the Thai character set requires 3 bytes in UTF8 or AL32UTF8. In addition, the maximum column lengths for CHAR, VARCHAR, and VARCHAR2 data types are 2000 bytes, 4000 bytes, and 4000 bytes respectively. If applications need to store more than 4000 bytes, then they should use the CLOB data type
    à ce que je comprends c'est NVarchar2(3)

  6. #6
    Membre habitué

    Inscrit en
    Février 2005
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 356
    Points : 175
    Points
    175
    Par défaut
    Oui je pense que ça doit être ça.

    D'ailleurs dans mon application Delphi, quand je fais un length du "symbole", il me retourne 3 et non 1 alors que je vois un seul "caractère" à l'écran.

    - Est-il préférable d'utiliser le jeu de caractère UTF8 3.0 ou AL16UTF16 ?

    - Est-il préférable d'utiliser varchar2(x char) ou Nvarchar2(x) ?
    varchar2 est plus "standard" ?
    quel est la réel différence entre ces 2 types ?

    Merci beaucoup

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Le lien que j'ai vous ai fourni traite aussi de ces questions, juste remonter au début de la page.

Discussions similaires

  1. unicode-utf8 application multi langue
    Par kripteks dans le forum Débuter
    Réponses: 13
    Dernier message: 09/10/2014, 18h54
  2. Réponses: 4
    Dernier message: 04/03/2014, 02h42
  3. [BP7] Multi-cpu, multi-core, multi-thread et programme Pascal
    Par Transgarp dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 07/04/2008, 18h43
  4. Bien créer une application multi-langues ? Unicode ou non ?
    Par Maxime Abbey dans le forum Composants VCL
    Réponses: 28
    Dernier message: 10/09/2007, 17h20
  5. [C#] Multi langue - fichier resource.resx
    Par dacamp dans le forum ASP.NET
    Réponses: 5
    Dernier message: 03/06/2004, 16h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo