Quelle est la différence entre les types de données VARCHAR et VARCHAR2 d'Oracle?


Réponses:


26

Il semblerait qu'Oracle ait prévu à un moment donné de donner une définition différente à VARCHAR qu'à VARCHAR2 . Il l'a dit aux clients et déconseille d'utiliser VARCHAR . Quels que soient leurs plans, au 11.2.0.2 VARCHAR est identique à VARCHAR2 . Voici ce que dit la référence de langage SQL 11g version 2 :

N'utilisez pas le type de données VARCHAR. Utilisez plutôt le type de données VARCHAR2. Bien que le type de données VARCHAR soit actuellement synonyme de VARCHAR2, le type de données VARCHAR doit être redéfini en tant que type de données distinct utilisé pour les chaînes de caractères de longueur variable par rapport à différentes sémantiques de comparaison.

Le Guide de l'utilisateur et de référence PL / SQL 10g version 2 le dit ainsi:

Actuellement, VARCHAR est synonyme de VARCHAR2. Cependant, dans les futures versions de PL / SQL, pour s'adapter aux nouvelles normes SQL, VARCHAR pourrait devenir un type de données distinct avec une sémantique de comparaison différente. C'est une bonne idée d'utiliser VARCHAR2 plutôt que VARCHAR.

Le document Database Concepts 10g Release 2 dit la même chose en termes plus forts:

Le type de données VARCHAR est synonyme du type de données VARCHAR2. Pour éviter d'éventuels changements de comportement, utilisez toujours le type de données VARCHAR2 pour stocker des chaînes de caractères de longueur variable.

La documentation d'Oracle 9.2 et 8.1.7 dit essentiellement la même chose, donc même si Oracle décourage continuellement l'utilisation de VARCHAR , jusqu'à présent, ils n'ont rien fait pour changer sa parité avec VARCHAR2 .


Je me souviens de varchar2 dans Oracle 8i, mais je ne sais pas s'il s'agissait du même varchar.
bernd_k


Il semble qu'à un certain moment avant 8i, la définition ait pu être différente.
Leigh Riffel

varcharAvant, je pensais qu'il y avait une limite de longueur différente avant la version 8, mais je ne trouve rien de fiable pour sauvegarder cela et je me demande maintenant si ce n'est qu'un mythe.
Jack Douglas

@Jack Douglas - Je ne trouve rien dans la documentation d'Oracle 7 à ce sujet. From docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/indexj.htm >> Oracle 7 Server >> Concepts du serveur >> Les types de données Oracle (ne peuvent pas y lier directement) disent à peu près la même chose que plus tard versions. Dans une autre section de la documentation de la version 7, il est dit que dans la version 6, Varchar et Varchar2 étaient synonymes de char.
Leigh Riffel

25

Actuellement, les deux sont synonymes.

VARCHAR est un type de données standard ANSI mais la mise en œuvre d'Oracle du type de données VARCHAR viole la norme ANSI en considérant la chaîne vide comme NULL (la mise en œuvre d'Oracle est antérieure à la norme ANSI). Comme le souligne Leigh, Oracle a déclaré que la sémantique du type de données VARCHAR pourrait changer à l'avenir en ce qui concerne le traitement de la chaîne vide. Si et quand cela se produit, la sémantique du type de données VARCHAR2 restera la même. L'utilisation du type de données VARCHAR2 est plus sûre car vous n'avez pas à vous inquiéter qu'une future version d'Oracle casse votre code en faisant en sorte que les chaînes vides ne soient plus considérées comme NULL.


3

Parce que dans la norme SQL d'origine, un VARCHAR était de 255 caractères, et Oracle avait au moins un essai de conformité aux normes à cette époque.


Cela donne espoir de voir Oracle varchar3 (max) dans quelques années.
bernd_k

Sql-server n'a eu aucun problème à augmenter la longueur autorisée de 255 à 8000 (et maintenant même au maximum). Pourquoi Oracle avait-il besoin d'un type de données différent.
bernd_k

1
Il n'y a pas besoin d'un varchar(max), utilisez simplement unCLOB
a_horse_with_no_name

3
CLOB a une sémantique différente de VARCHAR2
Gaius
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.