¿Cuál es la diferencia entre varchar y varchar2 en Oracle?


Respuestas:


337

Por ahora, son sinónimos.

VARCHARestá reservado Oraclepara admitir la distinción entre una NULLcadena vacía en el futuro, como lo ANSIprescribe el estándar.

VARCHAR2no distingue entre una NULLcadena vacía y una , y nunca lo hará.

Si confía en una cadena vacía y NULLes lo mismo, debe usar VARCHAR2.


40
No había escuchado esa razón antes, eso es útil. Gracias. Para el registro, todavía es totalmente ridículo que el tipo de personaje principal en Oracle sea "varchar2". ¿No le parece a nadie más un terrible error? Parece que habría resuelto algún problema en mi primera semana de aprendizaje para programar.
Ian Varley

77
@Ian: el tipo principal se VARCHAR2debe a que actualmente no hay ningún tipo que se comporte como VARCHARdebería. De hecho, no debe usarlo VARCHARhasta que se implemente correctamente.
Quassnoi

11
Gracias, @Quassnoi. Entonces, supongo que la parte estúpida es que Oracle no tiene un VARCHAR adecuado como cualquier otra base de datos. Hay algo estúpido pasando aquí, estoy seguro de eso ... :)
Ian Varley

11
@ Ian: cuando Oracle se estaba desarrollando, no había estándares. Cuando surgieron los estándares, ya tenía una carga de aplicaciones heredadas. Todos sabemos cómo sucede.
Quassnoi

55
Lo sentimos, en realidad fue @UnKnown quien escribió el comentario incorrecto al que respondía . El hecho de que where x is NULLlos rendimientos resultados diferentes de where x = ''hace no significa que NULLy ''son de alguna manera diferente. El comportamiento diferente se debe al =operador.
Dan Lenski


29

Tomado de la última versión estable de producción de Oracle 12.2: Tipos de datos

La principal diferencia es que VARCHAR2es un tipo de datos interno y VARCHARes un tipo de datos externo . Por lo tanto, debemos comprender la diferencia entre un tipo de datos interno y externo ...

Dentro de una base de datos, los valores se almacenan en columnas en tablas. Internamente, Oracle representa datos en formatos particulares conocidos como tipos de datos internos .

En general, las aplicaciones OCI (Oracle Call Interface) no funcionan con representaciones internas de datos de tipo de datos, sino con tipos de datos de idioma de host que están predefinidos por el idioma en el que están escritos. Cuando los datos se transfieren entre una aplicación de cliente OCI y una tabla de base de datos, las bibliotecas OCI convierten los datos entre tipos de datos internos y tipos de datos externos.

Los tipos externos proporcionan una conveniencia para el programador al permitir trabajar con tipos de lenguaje host en lugar de formatos de datos propietarios. OCI puede realizar una amplia gama de conversiones de tipos de datos al transferir datos entre una base de datos Oracle y una aplicación OCI. Hay más tipos de datos externos de OCI que tipos de datos internos de Oracle.

El VARCHAR2tipo de datos es una cadena de caracteres de longitud variable con una longitud máxima de 4000 bytes. Si el parámetro init.ora max_string_size es el predeterminado, la longitud máxima de a VARCHAR2puede ser de 4000 bytes. Si el parámetro init.ora max_string_size = extendido, la longitud máxima de a VARCHAR2puede ser 32767 bytes

El VARCHARtipo de datos almacena cadenas de caracteres de longitud variable. Los primeros 2 bytes contienen la longitud de la cadena de caracteres, y los bytes restantes contienen la cadena. La longitud especificada de la cadena en un enlace o una llamada de definición debe incluir los dos bytes de longitud, por lo que la VARCHARcadena más grande que se puede recibir o enviar es 65533 bytes de longitud, no 65535.

Una prueba rápida en una base de datos 12.2 sugiere que como un tipo de datos interna , Oracle todavía trata a un VARCHARcomo un pseudotipo para VARCHAR2. NO SYNONYMes un tipo de objeto real en 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)

También hay algunas implicaciones de las VARCHARopciones del precompilador ProC / C ++. Para los programadores interesados, el enlace se encuentra en: Pro * C / C ++ Programmer's Guide


1
Entonces, ¿esto significa que VARCHARtodavía trata '' == null?

2
Si. La discusión de los tipos internos vs externos es de la referencia de OCI. La referencia del lenguaje SQL 12.2 todavía lleva la misma declaración de 'no usar' que siempre ha tenido para VARCHAR.
William Robertson

Es por esto que he discutido las diferencias OCI, de lo contrario es más o menos reservado para uso futuro o como dicen 'de longitud variable' que podrían haciendo alusión a los juegos de caracteres tales como UTF-8 multibyte ...
Sandman

1
Usted mostró que los valores declarados como VARCHAR se almacenan en la base de datos como VARCHAR2, sin embargo, la longitud máxima de VARCHAR (65533 bytes) es mayor que la longitud máxima de VARCHAR2 (32767 bytes). ¿Cómo maneja esto la base de datos?
Piotr Dobrogost el

IIRC, hace mucho tiempo (¿Tal vez Oracle 6?) Había un tipo VARCHAR que se comportaba mal wrt al espacio de relleno, ¿o era truncar espacios? AAR, VARCHAR2 fue la respuesta. Oracle ha estado diciendo que traerán de vuelta VARCHAR pero, estoy seguro, habrá crujir de dientes cuando la cadena vacía NO ES NULA.
JMD

2

Después de experimentar un poco (ver más abajo), puedo confirmar que a partir de septiembre de 2017, nada ha cambiado con respecto a la funcionalidad descrita en la respuesta aceptada :

  1. Demostración de Rextester para Oracle 11g: las cadenas vacías se insertan comoNULLs para ambosVARCHAR yVARCHAR2.
  2. Demostración de LiveSQL para Oracle 12c: mismos resultados.

La razón histórica de estas dos palabras clave se explica bien en una respuesta a una pregunta diferente .


0
  1. VARCHAR puede almacenar hasta 2000 bytes de caracteres, mientras que VARCHAR2 puede almacenar hasta 4000 bytes de caracteres.

  2. Si declaramos el tipo de datos como VARCHAR, ocupará espacio para los valores NULL. En el caso del tipo de datos VARCHAR2, no ocupará ningún espacio para los valores NULL. p.ej,

    name varchar(10)

reservará 6 bytes de memoria incluso si el nombre es 'Ravi__', mientras que

name varchar2(10) 

reservará espacio de acuerdo con la longitud de la cadena de entrada. por ejemplo, 4 bytes de memoria para 'Ravi__'.

Aquí, _ representa NULL.

NOTA: varchar reservará espacio para valores nulos y varchar2 no reservará espacio para valores nulos.


2
Creo que esta respuesta está confundiendo VARCHARcon CHAR.
Jon Heller

0

Actualmente, son lo mismo. pero anteriormente

  1. En algún lugar de la red, leí eso,

VARCHARestá reservado por Oracle para admitir la distinción entre una NULLcadena vacía en el futuro, como lo prescribe el estándar ANSI.

VARCHAR2no distingue entre una NULLcadena vacía y una , y nunca lo hará.

  1. También,

Emp_name varchar(10)- si ingresa un valor de menos de 10 dígitos, el espacio restante no se puede eliminar. Usó un total de 10 espacios.

Emp_name varchar2(10) - si ingresa un valor de menos de 10 dígitos, el espacio restante se elimina automáticamente


Me topé con esta publicación recientemente, tenga en cuenta que es incorrecta. Ejecute lo siguiente y ambos campos serán 3 caracteres: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 es el sinónimo de VARCHAR2. Sin embargo, no debe usar VARCHAR porque Oracle puede cambiar su semántica en el futuro.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.