Réponses:
Pour l'instant, ce sont des synonymes.
VARCHARest réservé par Oraclepour prendre en charge la distinction entre NULLles chaînes vides à l'avenir, comme ANSIle prescrit la norme.
VARCHAR2ne fait pas de distinction entre une NULLchaîne vide et ne le fera jamais.
Si vous comptez sur une chaîne vide et NULLque c'est la même chose, vous devez utiliser VARCHAR2.
VARCHAR2dû au fait qu'il n'existe actuellement aucun type qui se comporte comme VARCHARil se doit. En fait, vous ne devriez pas utiliser VARCHARdu tout jusqu'à ce qu'il soit correctement implémenté.
where x is NULLrenvoie des résultats différents where x = ''ne signifie pas cela NULLet ''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 VARCHARne doit pas être utilisé car il est réservé pour une utilisation future.
Extrait de: Différence entre CHAR, VARCHAR, VARCHAR2
VARCHARne 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 VARCHAR2s'agit d'un type de données interne et d' VARCHARun 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 VARCHAR2type 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 VARCHAR2peut être de 4000 octets. Si le paramètre init.ora max_string_size = extended, la longueur maximale de a VARCHAR2peut être 32767 octets
Le VARCHARtype 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 VARCHARchaî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 VARCHARcomme un pseudotype pour VARCHAR2. Ce n'est PAS un SYNONYMtype 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 VARCHARpour 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 : -
NULLs 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
VARCHARest réservé par Oracle pour prendre en charge la distinction entre NULLles chaînes vides à l'avenir, comme le prescrit la norme ANSI.
VARCHAR2ne fait pas de distinction entre une NULLchaî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;