Différence entre les types de données CHAR, VARCHAR et VARCHAR2 dans Oracle

Oracle possède plusieurs types de données de type caractère qui sont couramment utilisés et qui peuvent également prêter à confusion si vous ne connaissez pas les différences entre eux. Découvrez ce qu’ils sont et les différences entre eux dans cet article.

Les types de données de caractères Oracle les plus utilisés sont CHAR et VARCHAR2. Il existe également un type de données VARCHAR.

Voyons ce que sont chacun de ces types de données.

Type de données CHAR

Le type de données CHAR stocke des valeurs de caractères. Il stocke ces valeurs sous la forme d’une chaîne de longueur fixe.

Cela signifie que les valeurs de chaîne seront paddées, ou se verront ajouter des caractères d’espacement, pour être stockées dans la base de données.

La longueur maximale d’une valeur CHAR est de 2000 octets.

Voyons un exemple de ceci.

Je vais créer une table d’exemple utilisant ces trois types de données, insérer quelques données et voir ce que cela donne.

CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));

Maintenant, insérons une valeur.

INSERT INTO chartest (char_column)VALUES ('abcde');

Maintenant, interrogeons la valeur. Je vais interroger la valeur, et la valeur à l’intérieur des parenthèses (pour voir où sont les espaces), vérifier la longueur, et ensuite effectuer un DUMP dessus pour voir quelques statistiques.

SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;

Résultat :

CHAR_COLUMN COL_FULL COL_LENGTH COL_DUMP
abcde (abcde ) 10 Typ=96 Len=10 : 97,98,99,100,101,32,32,32,32

Comme vous pouvez le constater, la valeur de abcde a été complétée par des espaces lors de son stockage pour la porter à une longueur de 10. Dans la sortie de la fonction DUMP, vous pouvez voir les codes pour chaque caractère qui est stocké. Le caractère 32 est un espace.

Type de données VARCHAR

Le type de données VARCHAR est un type de données standard ANSI, c’est pourquoi il est inclus dans Oracle.

Cependant, à l’heure actuelle, est le même que le type de données VARCHAR2.

Il a été inclus dans Oracle pour permettre une distinction entre les chaînes de caractères NULL et vides, ce que VARCHAR devrait faire, selon la norme ANSI. Cependant, dans Oracle, il ne le fait pas. Il fonctionne comme un VARCHAR2 où les chaînes vides sont traitées comme des valeurs NULL.

Donc, dans Oracle, la différence entre VARCHAR et VARCHAR2 n’est rien. Ils sont les mêmes.

Vous ne devriez pas utiliser le type de données VARCHAR car il est réservé à une fonctionnalité future d’Oracle et il pourrait changer.

Voyons un exemple. Nous allons utiliser la même table que précédemment, et insérer des données.

INSERT INTO chartest (varchar_column)VALUES ('fghij');

Maintenant, sélectionnons ces données.

SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;

Résultat :

VARCHAR_COLUMN COL_FULL COL_LENGTH COL_DUMP
fghij (fghij) 5 Typ=1 Len=5 : 102,103,104,105,106

Vous pouvez voir que la valeur entre parenthèses ne contient pas d’espaces, ce qui est dû au fait que VARCHAR2 et VARCHAR n’ajoutent pas d’espaces (ce dont je parlerai dans un moment). C’est aussi une longueur de 5 caractères.

VARCHAR2 Datatype

Le type de données VARCHAR2 est utilisé pour stocker des chaînes de caractères de longueur variable. Cela signifie que vous définissez une taille maximale et que les chaînes de caractères que vous insérez dans la colonne seront stockées telles qu’elles sont fournies. Aucun espace ne sera ajouté au caractère, comme le type de données CHAR.

La longueur maximale d’un type de données VARCHAR2 est de 4000 octets. Cependant, elle a été portée à 32 767 octets comme l’une des nouvelles fonctionnalités d’Oracle 12c.

Voyons un exemple.

INSERT INTO chartest (varchar2_column)VALUES ('klmno');

Maintenant, interrogeons le résultat.

SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;

Résultat :

VARCHAR2_COLUMN COL_FULL COL_LENGTH COL_DUMP
klmno (klmno) 5 Typ=1 Len=5 : 107,108,109,110,111

Vous pouvez voir que la sortie est la même que l’exemple VARCHAR. Aucun espace n’a été ajouté, et la longueur est la même. La seule différence concerne les caractères du code ASCII car la chaîne d’entrée était différente.

Différences : CHAR vs VARCHAR vs VARCHAR2

Regardons les différences entre ces trois types de données.

  • VARCHAR et VARCHAR2 sont exactement les mêmes. CHAR est différent.
  • CHAR a une taille maximale de 2000 octets, et VARCHAR/VARCHAR2 a une taille maximale de 4000 octets (ou 32 767 dans Oracle 12c)
  • CHAR n’a pas besoin qu’une taille soit spécifiée et a une valeur par défaut de 1. Une taille doit être spécifiée avec les colonnes VARCHAR/VARCHAR2.
  • CHAR rembourrera les espaces à droite des chaînes de caractères pour correspondre à la longueur de la colonne, alors que VARCHAR/VARCHAR2 ne le fait pas.

Les performances de CHAR, VARCHAR et VARCHAR2 sont les mêmes. Il n’y a pas de différence de performance avec ces types de données. CHAR n’est pas plus rapide que VARCHAR2, et VARCHAR2 n’est pas plus rapide que CHAR.

Tom Kyte a un post sur AskTom qui explique les détails techniques de ceci. Il explique également qu’un VARCHAR2 bourré de blanc est exactement la même chose qu’une valeur CHAR.

Réfléchissez-y un instant.

Bourrer de blanc une valeur VARCHAR2 est la même chose qu’une valeur CHAR.

Les types de données sont presque identiques.

Alors, lequel de ces types de données devriez-vous utiliser ?

Comme Tom Kyte en a discuté sur son forum et dans son livre (et avec lequel je suis d’accord), il n’y a aucune raison de jamais utiliser le type de données CHAR. VARCHAR2 peut couvrir toutes les situations où un CHAR pourrait être envisagé – même un CHAR(1) qui est le même qu’un VARCHAR2(1).

VARCHAR vs VARCHAR2

La différence entre VARCHAR et VARCHAR2 dans Oracle est que VARCHAR est un type de données au standard ANSI qui supporte une distinction entre NULL et les chaînes vides. Oracle n’a pas encore implémenté cette distinction, donc pour le moment, VARCHAR et VARCHAR2 sont identiques. Il est plus sûr d’utiliser VARCHAR2 car vous ne voulez pas que le code se casse si Oracle change VARCHAR dans le futur et que votre code utilise VARCHAR.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.