oracle - tipo - varchar vs varchar2
¿Cuál es la diferencia entre varchar y varchar2 en Oracle? (8)
¿Cuál es la diferencia entre varchar y varchar2?
VARCHAR2
se utiliza para almacenar cadenas de caracteres de longitud variable. La longitud del valor de la cadena se almacenará en el disco con el valor en sí.
variable x varchar2(10)
begin
:x := ''hullo'';
end;
/
VARCHAR
se comporta exactamente igual que VARCHAR2. Sin embargo, este tipo no debe utilizarse ya que está reservado para uso futuro
VARCHAR puede almacenar hasta 2000 bytes de caracteres, mientras que VARCHAR2 puede almacenar hasta 4000 bytes de caracteres.
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 según 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.
Actualmente, son los mismos. pero anteriormente
- En algún lugar de la red, leí eso,
VARCHAR
está reservado por Oracle para admitir la distinción entre NULL
y una cadena vacía en el futuro, como lo prescribe el estándar ANSI.
VARCHAR2
no distingue entre una cadena NULL
y vacía, y nunca lo hará.
- También,
Emp_name varchar(10)
: si ingresa un valor inferior a 10 dígitos, el espacio restante no se puede eliminar. Utilizó un total de 10 espacios.
Emp_name varchar2(10)
: si ingresa un valor de menos de 10 dígitos, el espacio restante se eliminará automáticamente
Después de algunos experimentos (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 :
- Demostración de Rextester para Oracle 11g: las cadenas vacías se insertan como
NULL
s paraVARCHAR
yVARCHAR2
. - 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 .
En cuanto a ahora, son sinónimos.
VARCHAR
está reservado por Oracle
para admitir la distinción entre NULL
y una cadena vacía en el futuro, como lo prescribe el estándar ANSI
.
VARCHAR2
no distingue entre una cadena NULL
y vacía, y nunca lo hará.
Si confía en una cadena vacía y NULL
es lo mismo, debe usar VARCHAR2
.
Tomado de la última versión de producción estable de Oracle 12.2: Tipos de datos
La principal diferencia es que VARCHAR2
es un tipo de datos interno y VARCHAR
es un tipo de datos externo . Por lo tanto, debemos entender 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 (Interfaz de llamada de Oracle) no funcionan con representaciones de datos de tipos de datos internos, sino con tipos de datos de lenguaje principal que están predefinidos por el idioma en el que se escriben. Cuando los datos se transfieren entre una aplicación 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 comodidad para el programador al hacer posible 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 OCI que tipos de datos internos de Oracle.
El tipo de datos VARCHAR2
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 está predeterminado, la longitud máxima de un VARCHAR2
puede ser de 4000 bytes. Si el parámetro init.ora max_string_size = extendido, la longitud máxima de un VARCHAR2
puede ser 32767 bytes
El tipo de datos VARCHAR
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 cadena VARCHAR
más grande que se puede recibir o enviar tiene una longitud de 65533 bytes, no 65535.
Una prueba rápida en una base de datos 12.2 sugiere que, como un tipo de datos interno , Oracle todavía trata a VARCHAR
como un pseudotipo para VARCHAR2
. NO es un SYNONYM
que es 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 VARCHAR
para las opciones del precompilador ProC / C ++. Para los programadores interesados, el enlace está en: Pro * C / C ++ Guía del programador
Actualmente VARCHAR se comporta exactamente igual que VARCHAR2. Sin embargo, este tipo no debe utilizarse, ya que está reservado para uso futuro.
Tomado de: Diferencia entre CHAR, VARCHAR, VARCHAR2
Diferencia:
-
VARCHAR
puede almacenar hasta 2000 bytes de caracteres, mientras queVARCHAR2
puede almacenar hasta 4000 bytes de caracteres. - Si declaramos el tipo de datos como
VARCHAR
, ocupará espacio para los valoresNULL
. En el caso del tipo de datosVARCHAR2
, no ocupará ningún espacio.
Semejanza:
-
VARCHAR
yVARCHAR2
son de carácter variable.