Réponses:
Pour l'instant, ce sont des synonymes.
VARCHAR
est réservé par Oracle
pour prendre en charge la distinction entre NULL
les chaînes vides à l'avenir, comme ANSI
le prescrit la norme.
VARCHAR2
ne fait pas de distinction entre une NULL
chaîne vide et ne le fera jamais.
Si vous comptez sur une chaîne vide et NULL
que c'est la même chose, vous devez utiliser VARCHAR2
.
VARCHAR2
dû au fait qu'il n'existe actuellement aucun type qui se comporte comme VARCHAR
il se doit. En fait, vous ne devriez pas utiliser VARCHAR
du tout jusqu'à ce qu'il soit correctement implémenté.
where x is NULL
renvoie des résultats différents where x = ''
ne signifie pas cela NULL
et ''
est en quelque sorte différent. Le comportement différent est dû à l' =
opérateur.
Actuellement, VARCHAR se comporte exactement de la même manière que VARCHAR2. Cependant, le type VARCHAR
ne doit pas être utilisé car il est réservé pour une utilisation future.
Extrait de: Différence entre CHAR, VARCHAR, VARCHAR2
VARCHAR
ne doit pas être utilisé. Je l'ai édité
Extrait de la dernière version de production Oracle stable 12.2: types de données
La principale différence est qu'il VARCHAR2
s'agit d'un type de données interne et d' VARCHAR
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 tableaux. En interne, Oracle représente les données dans des formats particuliers appelés types de données internes .
En général, les applications OCI (Oracle Call Interface) ne fonctionnent pas avec des représentations de type de données internes de données, mais avec des types de données de langue hôte qui sont prédéfinis par la langue dans laquelle ils sont écrits. Lorsque des données sont transférées entre une application cliente 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 VARCHAR2
type de données est une chaîne de caractères de longueur variable d'une longueur maximale de 4 000 octets. Si le paramètre init.ora max_string_size est par défaut, la longueur maximale de a VARCHAR2
peut être de 4000 octets. Si le paramètre init.ora max_string_size = extended, la longueur maximale de a VARCHAR2
peut être 32767 octets
Le VARCHAR
type de données 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 une liaison ou un appel de définition doit inclure les deux octets de longueur, de sorte que la plus grande VARCHAR
chaîne pouvant être reçue ou envoyée est longue de 65 533 octets et non de 65 535.
Un test rapide dans une base de données 12.2 suggère qu'en tant que type de données interne , Oracle traite toujours un VARCHAR
comme un pseudotype pour VARCHAR2
. Ce n'est PAS un SYNONYM
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 existe également des implications VARCHAR
pour les options du précompilateur ProC / C ++. Pour les programmeurs intéressés, le lien se trouve sur: Guide du programmeur Pro * C / C ++
Après quelques expérimentations (voir ci-dessous), je peux confirmer qu'à partir de septembre 2017, rien n'a changé en ce qui concerne les fonctionnalités décrites dans la réponse acceptée : -
NULL
s pourVARCHAR
etVARCHAR2
.La raison historique de ces deux mots clés est bien expliquée dans une réponse à une question différente .
VARCHAR peut stocker jusqu'à 2000 octets de caractères tandis que VARCHAR2 peut stocker jusqu'à 4000 octets de caractères.
Si nous déclarons le type de données VARCHAR, il occupera de l'espace pour les valeurs NULL. Dans le cas du type de données VARCHAR2, il n'occupera aucun espace pour les valeurs NULL. par exemple,
name varchar(10)
réservera 6 octets de mémoire même si le nom est 'Ravi__', alors que
name varchar2(10)
réservera de l'espace en fonction de la longueur de la chaîne d'entrée. par exemple, 4 octets de mémoire pour «Ravi__».
Ici, _ représente NULL.
REMARQUE: varchar réservera de l'espace pour les valeurs nulles et varchar2 ne réservera aucun espace pour les valeurs nulles.
VARCHAR
à confusion CHAR
.
Actuellement, ce sont les mêmes. mais auparavant
VARCHAR
est réservé par Oracle pour prendre en charge la distinction entre NULL
les chaînes vides à l'avenir, comme le prescrit la norme ANSI.
VARCHAR2
ne fait pas de distinction entre une NULL
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 peut 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 est automatiquement supprimé
create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;