web-dev-qa-db-fra.com

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

Quelle est la différence entre varchar et varchar2?

235
hrishi

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.

309
Quassnoi

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

36
Brian

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++

22
sandman

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 : -

  1. Démonstration de Rextester pour Oracle 11g: Les chaînes vides sont insérées sous la forme NULLs pour VARCHAR et VARCHAR2.
  2. démonstration de LiveSQL pour Oracle 12c: Mêmes résultats.

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

2
Steve Chambers

Actuellement, ils sont les mêmes. mais auparavant

  1. Quelque part sur le net, j'ai lu ça,

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.

  1. Aussi,

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é

1
Ramkumar P