¿Cuál es la diferencia entre los tipos de datos VARCHAR y VARCHAR2 de Oracle?

Respuestas:

26

Parecería que Oracle alguna vez tuvo planes de dar una definición diferente a VARCHAR que a VARCHAR2 . Se lo ha dicho a los clientes y recomienda no usar VARCHAR . Cualesquiera que fueran sus planes, a partir de 11.2.0.2 VARCHAR es idéntico a VARCHAR2 . Esto es lo que dice la referencia de lenguaje SQL 11g versión 2 :

No use el tipo de datos VARCHAR. Utilice el tipo de datos VARCHAR2 en su lugar. Aunque el tipo de datos VARCHAR es actualmente sinónimo de VARCHAR2, el tipo de datos VARCHAR está programado para redefinirse como un tipo de datos separado utilizado para cadenas de caracteres de longitud variable en comparación con diferentes semánticas de comparación.

La Guía del usuario de PL / SQL y la Referencia 10g Release 2 lo explican de esta manera:

Actualmente, VARCHAR es sinónimo de VARCHAR2. Sin embargo, en futuras versiones de PL / SQL, para dar cabida a los estándares SQL emergentes, VARCHAR podría convertirse en un tipo de datos separado con una semántica de comparación diferente. Es una buena idea usar VARCHAR2 en lugar de VARCHAR.

El documento 10G Release 2 de Database Concepts dice lo mismo en términos más fuertes:

El tipo de datos VARCHAR es sinónimo del tipo de datos VARCHAR2. Para evitar posibles cambios en el comportamiento, use siempre el tipo de datos VARCHAR2 para almacenar cadenas de caracteres de longitud variable.

La documentación de Oracle 9.2 y 8.1.7 dice esencialmente lo mismo, por lo que aunque Oracle desalienta continuamente el uso de VARCHAR , hasta ahora no han hecho nada para cambiar su paridad con VARCHAR2 .

Leigh Riffel
fuente
Recuerdo varchar2 en Oracle 8i, pero no estoy seguro de si era el mismo varchar entonces.
bernd_k
Hay indicios de que en algún momento antes de 8i la definición puede haber sido diferente.
Leigh Riffel
Antes pensaba que había un límite de longitud diferente varcharantes de la versión 8, pero no puedo encontrar nada de buena reputación para respaldar esto y ahora me pregunto si es solo un mito.
Jack Douglas el
@Jack Douglas: no puedo encontrar nada en la documentación de Oracle 7 sobre eso. De docs.oracle.com/cd/A57673_01/DOC/dcommon/oin/indexj.htm >> Oracle 7 Server >> Conceptos del servidor >> Oracle Datatypes (no se puede vincular directamente a él) dice casi lo mismo que más tarde versiones. En otra sección de la documentación de la versión 7 dice que en la versión 6 Varchar y Varchar2 eran sinónimos de char.
Leigh Riffel
25

Actualmente, los dos son sinónimos.

VARCHAR es un tipo de datos estándar ANSI, pero la implementación de Oracle del tipo de datos VARCHAR viola el estándar ANSI al considerar que la cadena vacía es NULL (la implementación de Oracle es anterior al estándar ANSI). Como señala Leigh, Oracle ha declarado que la semántica del tipo de datos VARCHAR puede cambiar en el futuro con respecto a cómo se trata la cadena vacía. Si eso sucede, la semántica del tipo de datos VARCHAR2 seguirá siendo la misma. Usar el tipo de datos VARCHAR2 es más seguro porque no tiene que preocuparse de que alguna versión futura de Oracle rompa su código al hacer que las cadenas vacías ya no se consideren NULL.

Justin Cave
fuente
3

Porque en el estándar SQL original, un VARCHAR tenía 255 caracteres, y Oracle tenía al menos una puñalada en el cumplimiento de los estándares en esos días.

Gayo
fuente
Eso da esperanza de ver Oracle varchar3 (max) en algunos años.
bernd_k
El servidor SQL no tuvo problemas para aumentar la longitud permitida de 255 a 8000 (y ahora incluso al máximo). ¿Por qué Oracle necesitaba un tipo de datos diferente?
bernd_k
1
No hay necesidad de un varchar(max), solo use unCLOB
a_horse_with_no_name
3
CLOB tiene una semántica diferente a VARCHAR2
Gaius