Quelle est la différence entre varchar et varchar2 dans Oracle?

Quelle est la différence entre varchar et varchar2?

194
demandé sur Steve Chambers 2009-07-23 15:40:25

8 réponses

pour l'instant, ce sont des synonymes.

VARCHAR est réservé par Oracle pour supporter la distinction entre NULL et chaîne vide à l'avenir, comme le prescrit la norme ANSI .

VARCHAR2 ne fait pas de distinction entre une NULL et une chaîne vide, et ne le fera jamais.

si vous utilisez une chaîne vide et NULL étant la même chose, vous devez utiliser VARCHAR2 .

264
répondu Quassnoi 2016-01-08 22:31:12

actuellement, VARCHAR se comporte exactement comme VARCHAR2. Toutefois, ce type ne doit pas être utilisé car il est réservé à un usage futur.

tiré de: différence entre CHAR, VARCHAR, VARCHAR2

32
répondu Brian 2009-07-23 11:43:16

tiré de la dernière version de stable Oracle production 12.2: Types De Données

la principale différence est que VARCHAR2 est un type de données internes et VARCHAR est un type de données externes . Nous devons donc comprendre la différence entre un type de données internes et externes...

dans une base de données, les valeurs sont stockées dans des colonnes dans les tableaux. Interne, Oracle représente des données dans des formats particuliers connus sous le nom de internal data types .

en général, les applications OCI (Oracle Call Interface) ne fonctionnent pas avec des représentations internes de type de données, mais avec des types de données de langue hôte qui sont prédéfinies par la langue dans laquelle elles sont écrites. Lorsque les données sont transférées entre une application client du bec et une table de base de données, les bibliothèques du bec convertissent les données entre les types de données internes et types de données externes.

Les types externes

offrent une commodité au programmeur en lui permettant de travailler avec des types de langues hôtes au lieu de formats de données propriétaires. Le bec peut effectuer une vaste gamme de conversions de types de données lors du transfert de données entre une base de données Oracle et une application du bec. Il y a plus de types de données externes du bec que de types de données internes D'Oracle.

le type de données VARCHAR2 est une chaîne de caractères de longueur variable avec une longueur maximale de 4000 octets. Si l'init.le paramètre Ora max_string_size est par défaut, la longueur maximale d'un VARCHAR2 peut être de 4000 octets. Si l'init.Ora paramètre max_string_size = extended, la longueur maximale d'un VARCHAR2 peut être 32767 octets

le type de données VARCHAR stocke des chaînes de caractères de longueur variable. Les 2 premiers octets contiennent la longueur de la chaîne de caractères, et les octets restants contiennent la chaîne. La longueur spécifiée de la la chaîne dans un bind ou un appel define doit inclure les deux octets de longueur, donc la plus grande chaîne VARCHAR qui peut être reçue ou envoyée est 65533 octets de long, pas 65535.

un test rapide dans une base de données 12.2 suggère que comme un type de données internes , Oracle traite encore un VARCHAR comme un pseudotype pour VARCHAR2 . Ce n'est pas un SYNONYM qui est un type d'objet réel dans Oracle.

SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production    

SQL> create table test (my_char varchar(20));
Table created.

SQL> desc test
Name                 Null?    Type
MY_CHAR                       VARCHAR2(20)

il y a aussi quelques implications de VARCHAR pour les options de pré-compilateur ProC/C++. Pour les programmeurs intéressés, le lien est à: Pro * C / C++ Programmer's Guide

13
répondu sandman 2017-09-01 16:45:25

après quelques expérimentations (voir ci-dessous), je peux confirmer qu'à partir de septembre 2017, rien n'a changé en ce qui concerne la fonctionnalité décrite dans la réponse acceptée : -

  1. Démo Rextester pour Oracle 11g: Les chaînes vides sont insérées comme NULL s pour les deux VARCHAR et VARCHAR2 .
  2. LiveSQL de démonstration pour Oracle 12c: mêmes résultats.

la raison historique de ces deux mots clés est bien expliquée dans une réponse à une question différente .

1
répondu Steve Chambers 2017-09-01 22:33:28

Actuellement, ils sont les mêmes. mais auparavant

  1. quelque part sur le net, j'ai lu que,

VARCHAR est réservé par Oracle pour supporter la distinction entre NULL et chaîne vide à l'avenir, comme la norme ANSI prescrit.

VARCHAR2 ne fait pas de distinction entre une NULL et une chaîne vide, et ne le fera jamais.

  1. Aussi,

Emp_name varchar(10) - si vous entrez une valeur inférieure à 10 chiffres, l'espace restant ne peut pas être supprimé. il a utilisé un total de 10 places.

Emp_name varchar2(10) - si vous entrez une valeur inférieure à 10 chiffres, l'espace restant est automatiquement supprimé

1
répondu Ramkumar P 2018-07-16 10:52:26

VARCHAR2

est utilisé pour stocker des chaînes de caractères de longueur variable. La longueur de la chaîne de caractères sera stockée sur le disque avec la valeur elle-même.

variable x varchar2(10)
begin
 :x := 'hullo';
end;
/

VARCHAR

se comporte exactement comme VARCHAR2. Toutefois, ce type ne doit pas être utilisé car il est réservé à un usage futur

0
répondu Nisar 2014-04-06 13:15:24
  1. VARCHAR peut stocker jusqu'à 2000 octets de caractères tandis que VARCHAR2 peut stocker jusqu'à 4000 octets de caractères.

  2. si nous déclarons datatype comme VARCHAR alors il occupera l'espace pour les valeurs nulles. Dans le cas de VARCHAR2 datatype, il n'occupera aucun espace pour les valeurs nulles. par exemple,

    name varchar(10)

réservera 6 octets de mémoire même si le nom: "Ravi___", alors que

name varchar2(10) 

réserve de l'espace en fonction de la longueur de la chaîne de saisie. par exemple, 4 octets de mémoire pour 'Ravi__'.

ici, _ représente NULL.

NOTE: varchar réserve de l'espace pour les valeurs nulles et varchar2 ne réserve aucun espace pour les valeurs nulles.

-1
répondu Palak Jain 2017-04-27 20:50:35

différence:

  • VARCHAR peut stocker jusqu'à 2000 octets de caractères, tandis que VARCHAR2 peut stocker jusqu'à 4000 octets de caractères.
  • si nous déclarons type de données comme VARCHAR alors il occupera l'espace pour les valeurs NULL , dans le cas de VARCHAR2 type de données il n'occupera aucun espace.

similarité:

  • VARCHAR et VARCHAR2 sont tous deux de caractère variable.

source

-1
répondu Premraj 2018-04-06 03:04:49