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

Réponses:

337

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.

Quassnoi
la source
40
Je n'avais jamais entendu cette justification auparavant, c'est utile. Merci. Pour mémoire, il est toujours totalement ridicule que le type de personnage principal dans Oracle soit "varchar2". Cela ne frappe-t-il personne d'autre comme un terrible coup de coude? On dirait que j'aurais résolu un problème au cours de ma première semaine d'apprentissage de la programmation.
Ian Varley,
7
@Ian: le type principal est 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é.
Quassnoi
11
Merci, @Quassnoi. Donc je suppose que la partie stupide est qu'Oracle n'a pas de VARCHAR approprié comme toutes les autres bases de données, alors? Il se passe quelque chose de stupide ici, j'en suis sûr ... :)
Ian Varley
11
@Ian: lors du développement d'Oracle, il n'y avait pas de normes. Au moment où les normes ont émergé, il y avait déjà un fardeau d'applications héritées. Nous savons tous comment cela se produit.
Quassnoi du
5
Désolé, c'est en fait @UnKnown qui a écrit le commentaire incorrect auquel je répondais . Le fait que 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.
Dan Lenski
38

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

Brian
la source
@PhilipRego VARCHARne doit pas être utilisé. Je l'ai édité
bugybunny
29

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

marchand de sable
la source
1
cela signifie-t-il que cela VARCHARtraite toujours '' == null?
2
Oui. La discussion sur les types internes et externes ci-dessus provient de la référence OCI. La référence de langage SQL 12.2 contient toujours la même instruction «ne pas utiliser» qu'elle a toujours eu pour VARCHAR.
William Robertson
C'est pourquoi j'ai discuté des différences OCI, sinon il est à peu près réservé pour une utilisation future ou comme on dit `` longueur variable '' qui pourrait faire allusion à des jeux de caractères tels que UTF8 multi-octets ...
sandman
1
Vous avez montré que les valeurs déclarées en tant que VARCHAR sont stockées dans la base de données en tant que VARCHAR2, mais la longueur maximale de VARCHAR (65533 octets) est supérieure à la longueur maximale de VARCHAR2 (32767 octets). Comment la base de données gère-t-elle cela?
Piotr Dobrogost
IIRC, il y a longtemps (peut-être Oracle 6?), Il y avait un type VARCHAR qui se comportait mal par rapport au remplissage de l'espace - ou était-ce la troncature d'espaces? AAR, VARCHAR2 était la réponse. Oracle a dit qu'ils ramèneraient VARCHAR mais, j'en suis sûr, il y aurait des grincements de dents lorsque la chaîne vide N'EST PAS NULL.
JMD
2

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

  1. Démonstration Rextester pour Oracle 11g: des chaînes vides sont insérées en tant queNULLs pourVARCHAR etVARCHAR2.
  2. Démo LiveSQL 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 .

Steve Chambers
la source
0
  1. VARCHAR peut stocker jusqu'à 2000 octets de caractères tandis que VARCHAR2 peut stocker jusqu'à 4000 octets de caractères.

  2. 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.

Palak Jain
la source
2
Je pense que cette réponse prête VARCHARà confusion CHAR.
Jon Heller
0

Actuellement, ce sont les mêmes. mais auparavant

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

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.

  1. 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 espaces.

Emp_name varchar2(10) - si vous entrez une valeur inférieure à 10 chiffres, l'espace restant est automatiquement supprimé

Ramkumar P
la source
Je suis tombé sur ce post récemment, veuillez noter qu'il est incorrect. Exécutez le texte suivant et les deux champs auront 3 caractères: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;
Brian Leach
-1

VARCHAR est le synonyme de VARCHAR2. Cependant, vous ne devez pas utiliser VARCHAR car Oracle peut changer sa sémantique à l'avenir.

Premraj
la source