web-dev-qa-db-fra.com

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

Lors de la migration de tables provenant d'autres SGBD vers Oracle, l'une des tâches standard consiste à remplacer tous les champs VARCHAR(n) par VARCHAR2(n) champs (fourni n <= 4000) .

Pourquoi Oracle appelle-t-il ce type de données VARCHAR2 et pas seulement VARCHAR comme les autres SGBD?

19
bernd_k

Il semblerait qu'Oracle envisageait à un moment donné de donner une définition différente à [~ # ~] varchar [~ # ~] qu'à VARCHAR2 . Il l'a dit aux clients et recommande de ne pas utiliser [~ # ~] varchar [~ # ~] . Quels que soient leurs plans, au 11.2.0.2 [~ # ~] varchar [~ # ~] est identique à VARCHAR2 . Voici ce que le SQL Language Reference 11g Release 2 dit:

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 devrait ê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.

PL/SQL - Guide de l'utilisateur et référence 10g version 2 dit ceci:

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 .

26
Leigh Riffel

Actuellement, les deux sont synonymes.

VARCHAR est un type de données standard ANSI mais l'implémentation d'Oracle du type de données VARCHAR viole la norme ANSI en considérant la chaîne vide comme NULL (l'implémentation d'Oracle est antérieure à la norme ANSI). Comme Leigh le fait remarquer, 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.

25
Justin Cave

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

3
Gaius