¿Cuál es la diferencia entre varchar y varchar2?
oracle
sqldatatypes
hrishi
fuente
fuente
Respuestas:
Por ahora, son sinónimos.
VARCHAR
está reservadoOracle
para admitir la distinción entre unaNULL
cadena vacía en el futuro, como loANSI
prescribe el estándar.VARCHAR2
no distingue entre unaNULL
cadena vacía y una , y nunca lo hará.Si confía en una cadena vacía y
NULL
es lo mismo, debe usarVARCHAR2
.fuente
VARCHAR2
debe a que actualmente no hay ningún tipo que se comporte comoVARCHAR
debería. De hecho, no debe usarloVARCHAR
hasta que se implemente correctamente.where x is NULL
los rendimientos resultados diferentes dewhere x = ''
hace no significa queNULL
y''
son de alguna manera diferente. El comportamiento diferente se debe al=
operador.Actualmente VARCHAR se comporta exactamente igual que VARCHAR2. Sin embargo, el tipo
VARCHAR
no debe usarse, ya que está reservado para uso futuro.Tomado de: Diferencia entre CHAR, VARCHAR, VARCHAR2
fuente
VARCHAR
no debe usarse. LoTomado de la última versión estable de producción de Oracle 12.2: Tipos de datos
La principal diferencia es que
VARCHAR2
es un tipo de datos interno yVARCHAR
es 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
VARCHAR2
tipo 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 aVARCHAR2
puede ser de 4000 bytes. Si el parámetro init.ora max_string_size = extendido, la longitud máxima de aVARCHAR2
puede ser 32767 bytesEl
VARCHAR
tipo 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 laVARCHAR
cadena 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
VARCHAR
como un pseudotipo paraVARCHAR2
. NOSYNONYM
es un tipo de objeto real en Oracle.También hay algunas implicaciones de las
VARCHAR
opciones del precompilador ProC / C ++. Para los programadores interesados, el enlace se encuentra en: Pro * C / C ++ Programmer's Guidefuente
VARCHAR
todavía trata'' == null
?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 :
NULL
s para ambosVARCHAR
yVARCHAR2
.La razón histórica de estas dos palabras clave se explica bien en una respuesta a una pregunta diferente .
fuente
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
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.
fuente
VARCHAR
conCHAR
.Actualmente, son lo mismo. pero anteriormente
VARCHAR
está reservado por Oracle para admitir la distinción entre unaNULL
cadena vacía en el futuro, como lo prescribe el estándar ANSI.VARCHAR2
no distingue entre unaNULL
cadena vacía y una , y nunca lo hará.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áticamentefuente
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;
VARCHAR es el sinónimo de VARCHAR2. Sin embargo, no debe usar VARCHAR porque Oracle puede cambiar su semántica en el futuro.
fuente