Quelle est la différence entre varchar et varchar2 dans Oracle?
Quelle est la différence entre varchar et varchar2?
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
.
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 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 externesoffrent 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
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 : -
- Démo Rextester pour Oracle 11g:
Les chaînes vides sont insérées comme
NULL
s pour les deuxVARCHAR
etVARCHAR2
. - 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 .
Actuellement, ils sont les mêmes. mais auparavant
- 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.
- 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é
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
-
VARCHAR peut stocker jusqu'à 2000 octets de caractères tandis que VARCHAR2 peut stocker jusqu'à 4000 octets de caractères.
-
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.
différence:
-
VARCHAR
peut stocker jusqu'à 2000 octets de caractères, tandis queVARCHAR2
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 valeursNULL
, dans le cas deVARCHAR2
type de données il n'occupera aucun espace.
similarité:
-
VARCHAR
etVARCHAR2
sont tous deux de caractère variable.