La différence entre CHAR, VARCHAR et VARCHAR2

Oracle dispose de trois types de données pour stocker les chaînes de caractères . – CHAR, VARCHAR et VARCHAR2. En quoi diffèrent-ils les uns des autres ? Quand faut-il utiliser lequel ?

Découvrons les réponses dans cet article.

Le plus simple d’abord : VARCHAR et VARCHAR2 sont les mêmes. Mais que ce aujourd’hui – cela pourrait changer. Jetez un coup d’œil à la documentation Oracle 10G Release 2:

N’utilisez pas le type de données VARCHAR. Utilisez plutôt le type de données VARCHAR2. Bien que le type de données VARCHAR soit actuellement synonyme de VARCHAR2, il est prévu que le type de données VARCHAR soit redéfini comme un type de données distinct utilisé pour les chaînes de caractères de longueur variable comparées avec une sémantique de comparaison différente.

Dans cet article, VARCHAR2 est utilisé pour signifier à la fois VARCHAR et VARCHAR2 tels qu’ils sont équivalents aujourd’hui.

En quoi CHAR et VARCHAR2 sont-ils différents alors ?

La différence est que CHAR(n) aura TOUJOURS une longueur de n octets. Si la longueur de la chaîne est <n, elle sera remplie de blanc à l’insertion pour garantir une longueur de n. Par contre, un VARCHAR2(n) aura une longueur de 1 à n octets. Une chaîne de caractères plus courte stockée en tant que VARCHAR2 ne sera PAS remplie de blanc.

Par exemple, supposons que vous stockez la chaîne de caractères ‘ORATABLE’ dans un champ CHAR(20) et un champ VARCHAR2(20). Le champ CHAR utilisera 22 octets (2 octets pour la longueur d’attaque). Le champ VARCHAR2 utilisera 10 octets seulement (8 pour la chaîne de caractères, 2 octets pour la longueur de tête).

Pour résumer, CHAR est VARCHAR2 padded à sa longueur maximale.

Comment cette différence a un impact sur les SQLs ?

Cela change la façon dont les chaînes de caractères sont appariées dans CHAR vs VARCHAR2. Vérifiez-le en action :

SQL> create table strings 2 (colchar char (20) 3 , colvarchar varchar2 (20));Table created.SQL>SQL> insert into strings 2 (colchar, colvarchar) 3 values 4 ('ORATABLE', 'ORATABLE');1 row created.SQL> -- Define a string variableSQL> var str varchar2(20)SQL> -- Give it a value with length < 20SQL> exec :str := 'ORATABLE'PL/SQL procedure successfully completed.SQL> -- Exact string match with CHARSQL> -- No result found!SQL> select 'found' found_flag 2 from strings 3 where colchar = :str;no rows selectedSQL> -- Padded string match with CHARSQL> -- Now it finds itSQL> select 'found' found_flag 2 from strings 3 where colchar = rpad(:str,20);FOUND-----found

Vous voyez donc que le remplissage avec des blancs fait une différence pour que la chaîne CHAR soit mise en correspondance avec un paramètre de longueur variable. Pour obtenir une correspondance, vous devez soit rpad la valeur, soit rtrim la colonne.

Aucune exigence de ce genre avec VARCHAR2:

SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found

Quand devons-nous utiliser CHAR, quand VARCHAR2?

Si vous n’utilisez jamais que VARCHAR2 et ignorez CHAR, vous vous simplifierez grandement la vie. Il n’y a aucune différence entre les deux, sauf que CHAR utilise plus d’espace lorsque vos chaînes de caractères ne sont pas toujours de la longueur maximale fixée. De plus, CHAR entraîne plus de confusion dans l’écriture des requêtes.

J’utilise CHAR comme colonnes de base de données uniquement pour les valeurs de type Y/N. (Il n’y a pas de type de données de colonne BOOLEAN, rappelez-vous ?) Cela agit comme un marqueur pour un type de colonne « drapeau » ou « commutateur » – mais cela aurait tout aussi bien pu être VARCHAR2.

Pour toutes les autres chaînes de caractères, c’est VARCHAR2.

Résumé

Lorsque vous considérez les types de données Oracle CHAR, VARCHAR et VARCHAR2, n’oubliez pas que :

  • VARCHAR et VARCHAR2 sont les mêmes, mais la fonction de VARCHAR pourrait changer à l’avenir. Utilisez VARCHAR2.
  • CHAR et VARCHAR2 sont différents dans la mesure où le CHAR tamponne en blanc ses chaînes de caractères pour qu’elles soient de sa longueur maximale. VARCHAR2 ne fait pas de remplissage à blanc.
  • En raison de ce qui précède, les requêtes qui impliquent une comparaison de chaînes de caractères sur une colonne CHAR nécessitent plus de précautions – un VARCHAR2 comparé à CHAR doit être rpad-dé pour obtenir un résultat.
  • Il faut le répéter : utilisez VARCHAR2 !

.

Laisser un commentaire

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