Quelle est la différence entre varchar et varchar2?
Pour l'instant, ce sont des synonymes.
VARCHAR
est réservé par Oracle
pour permettre la distinction entre NULL
et une chaîne vide à l'avenir, comme le préconise ANSI
standard.
VARCHAR2
ne fait pas la distinction entre un NULL
et une chaîne vide, et ne le fera jamais.
Si vous comptez sur une chaîne vide et que NULL
est identique, vous devez utiliser VARCHAR2
.
Actuellement, VARCHAR se comporte exactement comme VARCHAR2. Cependant, le type VARCHAR
ne doit pas être utilisé car il est réservé à un usage ultérieur.
Extrait de: Différence entre CHAR, VARCHAR, VARCHAR2
Tiré de la dernière version de production stable d'Oracle 12.2: types de données
La principale différence est que VARCHAR2
est un type de données interne et VARCHAR
est un type de données externe . Nous devons donc comprendre la différence entre un type de données interne et externe ...
Dans une base de données, les valeurs sont stockées dans des colonnes dans des tables. En interne, Oracle représente les données dans des formats particuliers appelés types de données internes .
En règle générale, les applications OCI (Oracle Call Interface) ne fonctionnent pas avec les représentations de type de données internes, mais avec les types de données de langage hôte prédéfinis par le langage dans lequel elles sont écrites. Lorsque les données sont transférées entre une application client OCI et une table de base de données, les bibliothèques OCI convertissent les données entre les types de données internes et les types de données externes.
Les types externes offrent une commodité au programmeur en permettant de travailler avec des types de langage hôte au lieu de formats de données propriétaires. OCI peut effectuer une large gamme de conversions de types de données lors du transfert de données entre une base de données Oracle et une application OCI. Il existe plus de types de données externes OCI que de types de données internes Oracle.
Le type de données VARCHAR2
est une chaîne de caractères de longueur variable d'une longueur maximale de 4000 octets. Si le paramètre init.ora max_string_size est la valeur par défaut, la longueur maximale d'un VARCHAR2
peut être de 4 000 octets. Si le paramètre init.ora max_string_size = extended, la longueur maximale d'un VARCHAR2
peut être de 32 767 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 chaîne dans un appel bind ou define doit inclure les deux octets de longueur. La plus grande chaîne VARCHAR
pouvant être reçue ou envoyée est longue de 65 533 octets et non de 65535.
Un test rapide dans une base de données 12.2 suggère que, en tant que type de données interne , Oracle considère toujours 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 des implications de VARCHAR
pour les options du précompilateur ProC/C++. Pour les programmeurs intéressés, le lien est à: Guide du programmeur Pro * C/C++
Après quelques expériences (voir ci-dessous), je peux confirmer que depuis septembre 2017, rien n'a changé en ce qui concerne la fonctionnalité décrite dans la réponse acceptée : -
NULL
s pour VARCHAR
et VARCHAR2
.La raison historique de ces deux mots clés est bien expliquée dans ne réponse à une question différente .
Actuellement, ils sont les mêmes. mais auparavant
VARCHAR
est réservé par Oracle pour prendre en charge la distinction entre NULL
et une chaîne vide à l'avenir, comme le prescrit le standard ANSI.
VARCHAR2
ne fait pas la distinction entre un NULL
et une chaîne vide, et ne le fera jamais.
Emp_name varchar(10)
- si vous entrez une valeur inférieure à 10 chiffres, l'espace restant ne pourra pas être supprimé. il a utilisé un total de 10 espaces.
Emp_name varchar2(10)
- si vous entrez une valeur inférieure à 10 chiffres, l'espace restant sera automatiquement supprimé