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


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

Author: Steve Chambers, 2009-07-23

8 answers

Por ahora, son sinónimos.

VARCHAR está reservado por Oracle para admitir la distinción entre NULL y la cadena vacía en el futuro, como prescribe ANSI standard.

VARCHAR2 no distingue entre una cadena NULL y vacía, y nunca lo hará.

Si confías en una cadena vacía y NULL es lo mismo, deberías usar VARCHAR2.

 264
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-08 22:31:12

Actualmente VARCHAR se comporta exactamente igual que VARCHAR2. Sin embargo, este tipo no debe usarse ya que está reservado para uso futuro.

Tomado de: Diferencia entre CHAR, VARCHAR, VARCHAR2

 32
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-23 11:43:16

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

La principal diferencia es que VARCHAR2 es interno tipo de datos y VARCHAR es externo tipo de datos. Así que necesitamos 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 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 host predefinidos por el idioma en el que están escritos. 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 el lenguaje host tipos 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 tipo de datos VARCHAR2 es una cadena de caracteres de longitud variable con una longitud máxima de 4000 bytes. Si el init.orun parámetro max_string_size es predeterminado, la longitud máxima de un VARCHAR2 puede ser de 4000 bytes. Si el init.parámetro ora max_string_size = extended, la longitud máxima de un VARCHAR2 puede ser de 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 una llamada bind o define debe incluir los dos bytes de longitud, por lo que la cadena VARCHAR más grande que se puede recibir o enviar es 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 un 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 de Precompilador ProC/C++. Para los programadores interesados, el enlace está en: Pro * C / C++ Programmer's Guide

 13
Author: sandman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 16:45:25

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:-

  1. Demostración de Rextester para Oracle 11g: Las cadenas vacías se insertan como NULL s para ambos VARCHAR y VARCHAR2.
  2. Demostración de LiveSQL para Oracle 12c: Los mismos resultados.

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

 1
Author: Steve Chambers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 22:33:28

Actualmente, son los mismos. pero anteriormente

  1. En algún lugar de la red, leí que, {[10]]}

VARCHAR está reservado por Oracle para admitir la distinción entre NULL y la cadena vacía en el futuro, como prescribe el estándar ANSI.

VARCHAR2 no distingue entre una cadena NULL y vacía, y nunca lo hará.

  1. También,

Emp_name varchar(10) - si introduce un valor inferior a 10 dígitos, el espacio restante no se puede eliminar. se utilizó un total de 10 espacio.

Emp_name varchar2(10) - si introduce un valor inferior a 10 dígitos, el espacio restante se elimina automáticamente

 1
Author: Ramkumar P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-16 10:52:26

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 usarse ya que está reservado para uso futuro

 0
Author: Nisar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-06 13:15:24
  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, entonces ocupará espacio para los valores NULL. En el caso del tipo de datos VARCHAR2, no ocupará ningún espacio para valores NULOS. por ejemplo,

    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.

 -1
Author: Palak Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-27 20:50:35

Diferencia:

  • 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 entonces ocupará espacio para los valores NULL, en el caso del tipo de datos VARCHAR2 no ocupará ningún espacio.

Similitud:

  • VARCHAR y VARCHAR2 ambos son de carácter variable.

Fuente

 -1
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-06 03:04:49