Quelle est la différence entre varchar et VARCHAR2 Oracle?
-
19-09-2019 - |
Question
Quelle est la différence entre varchar et varchar2?
La solution
Pour l'instant, ils sont synonymes.
VARCHAR
est réservé par Oracle
pour soutenir la distinction entre NULL
et chaîne vide à l'avenir, en tant que norme de ANSI
prescrit.
VARCHAR2
ne distingue pas entre un NULL
et une chaîne vide, et ne le sera jamais.
Si vous comptez sur une chaîne vide et NULL
être la même chose, vous devez utiliser VARCHAR2
.
Autres conseils
À l'heure actuelle VARCHAR se comporte exactement les mêmes que VARCHAR2. Cependant, le VARCHAR
type ne doit pas être utilisé comme il est réservé pour un usage futur.
Tiré de la dernière version stable de la production Oracle 12.2: Types de données
La différence majeure est que VARCHAR2
est un type de données interne et VARCHAR
est un type de données externe . Nous avons donc besoin de comprendre la différence entre un type de données internes et externes ...
Dans une base de données, les valeurs sont stockées dans des colonnes dans les tableaux. En interne, Oracle représente des 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 langage hôte qui sont prédéfinies par la langue dans laquelle ils sont écrits. Lorsque les données sont transférées entre une application client OCI et une table de base de données, les bibliothèques du BEC convertissent les données entre les types de données internes et types de données externes.
types externes offrent une commodité pour le programmeur en permettant de travailler avec les types de langage hôte au lieu des formats de données propriétaires. BEC 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 plusieurs types de données externes BEC que les types de données internes Oracle.
Le type de données VARCHAR2
est une chaîne de longueur variable de caractères avec une longueur maximale de 4000 octets. Si le paramètre init.ora max_string_size est par défaut, la longueur maximale d'un VARCHAR2
peut être 4000 octets. Si le paramètre init.ora max_string_size = étendue, la durée maximale d'un VARCHAR2
peut être 32767 octets
Les magasins de type données VARCHAR
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 de la chaîne spécifiée dans une liaison ou un appel définir doivent inclure les deux octets de longueur, de sorte que la plus grande chaîne de VARCHAR
qui peut être reçu ou envoyé est 65533 octets, et non pas 65.535.
Un test rapide dans une base de données 12.2 suggère que comme type de données interne , Oracle traite encore VARCHAR
comme pseudotype pour VARCHAR2
. Il 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 ProC / C ++ precompiler. Pour les programmeurs qui sont intéressés, le lien est à l'adresse: Pro * C / Guide de programmeur C ++
Après quelques essais (voir ci-dessous), je peux confirmer que à partir de Septembre 2017, rien n'a changé en ce qui concerne les fonctionnalités décrites dans la réponse acceptée : -
- Rextester démo pour Oracle 11g:
Les chaînes vides sont insérés comme
NULL
s pour les deuxVARCHAR
etVARCHAR2
. - LiveSQL démo pour 12c Oracle: Les mêmes résultats.
La raison historique pour ces deux mots-clés est bien expliqué dans une réponse à une question différente.
À l'heure actuelle, ils sont les mêmes. mais auparavant
- Quelque part sur le net, je lis que,
VARCHAR
est réservé par Oracle pour soutenir la distinction entre NULL
et chaîne vide à l'avenir, comme prescrit norme ANSI.
VARCHAR2
ne distingue pas entre un NULL
et une chaîne vide, et ne le sera jamais.
- En outre,
Emp_name varchar(10)
- si vous entrez valeur inférieure à 10 chiffres, puis l'espace restant ne peut pas être supprimé. il utilise au total 10 espaces.
Emp_name varchar2(10)
- si vous entrez valeur inférieure à 10 chiffres, puis l'espace restant est automatiquement supprimé
-
VARCHAR peut stocker jusqu'à 2000 octets de caractères tout en VARCHAR2 peut stocker jusqu'à 4000 octets de caractères.
-
Si nous déclarons que VARCHAR alors datatype il occupera l'espace pour les valeurs NULL. Dans le cas de VARCHAR2 type de données, il ne sera pas occuper un espace pour les valeurs NULL. par ex.,
name varchar(10)
réservera 6 octets de mémoire, même si le nom est « Ravi__ », alors que
name varchar2(10)
réservera 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.
NOTE:. Varchar réservera un espace pour les valeurs nulles et varchar2 ne se réservera pas d'espace pour les valeurs NULL
différence:
-
VARCHAR
peut stocker jusqu'à 2000 octets de caractères tout enVARCHAR2
peut stocker jusqu'à 4000 octets de caractères. - Si nous déclarons que
VARCHAR
alors datatype il occupera l'espace pour les valeurs deNULL
, en cas deVARCHAR2
il ne sera pas datatype occuper tout l'espace.
similarité:
-
VARCHAR
etVARCHAR2
les deux sont de caractère variable.