Diferencia entre los tipos de datos CHAR, VARCHAR y VARCHAR2 en Oracle

Oracle tiene varios tipos de datos de carácter que se utilizan comúnmente y también pueden ser confusos si no se conocen las diferencias entre ellos. Aprenda lo que son y las diferencias entre ellos en este artículo.

Los tipos de datos de caracteres de Oracle que se utilizan con más frecuencia son CHAR y VARCHAR2. También hay un tipo de datos VARCHAR.

Veamos qué es cada uno de estos tipos de datos.

Tipo de datos CHAR

El tipo de datos CHAR almacena valores de caracteres. Almacena estos valores como una cadena de longitud fija.

Esto significa que los valores de cadena se rellenarán, o se les añadirán caracteres de espacio, para ser almacenados en la base de datos.

La longitud máxima de un valor CHAR es de 2000 bytes.

Veamos un ejemplo de esto.

Crearé una tabla de ejemplo utilizando estos tres tipos de datos, insertaré algunos datos y veré lo que muestra.

CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));

Ahora, insertemos un valor.

INSERT INTO chartest (char_column)VALUES ('abcde');

Ahora, consultemos el valor. Voy a consultar el valor, y el valor dentro de los paréntesis (para ver dónde están los espacios), comprobar la longitud, y luego realizar un DUMP en él para ver algunas estadísticas.

SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;

Resultado:

CHAR_COLUMN COL_FULL COL_LENGTH COL_DUMP
abcde (abcde ) 10 Typ=96 Len=10: 97,98,99,100,101,32,32,32,32,32

Como puedes ver, el valor de abcde ha sido rellenado con espacios al ser almacenado para que tenga una longitud de 10. En la salida de la función DUMP, puedes ver los códigos de cada carácter que se almacena. El carácter 32 es un espacio.

Tipo de datos VARCHAR

El tipo de datos VARCHAR es un tipo de datos estándar ANSI, por lo que está incluido en Oracle.

Sin embargo, de momento, es el mismo que el tipo de datos VARCHAR2.

Se incluyó en Oracle para permitir distinguir entre cadenas NULL y vacías, que es lo que debería hacer VARCHAR, según el estándar ANSI. Sin embargo, en Oracle no lo hace. Funciona como un VARCHAR2 donde las cadenas vacías se tratan como valores NULL.

Así que, en Oracle, la diferencia entre VARCHAR y VARCHAR2 no es nada. Son lo mismo.

No deberías usar el tipo de datos VARCHAR ya que está reservado para futuras funcionalidades de Oracle y podría cambiar.

Veamos un ejemplo. Utilizaremos la misma tabla que antes, e insertaremos algunos datos.

INSERT INTO chartest (varchar_column)VALUES ('fghij');

Ahora, vamos a seleccionar estos datos.

SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;

Resultado:

VARCHAR_COLUMN COL_FULL COL_LENGTH COL_DUMP
fghij (fghij) 5 Typ=1 Len=5: 102,103,104,105,106

Puedes ver que el valor entre paréntesis no contiene espacios, lo que se debe a que VARCHAR2 y VARCHAR no añaden espacios (de lo que hablaré en un momento). También tiene una longitud de 5 caracteres.

Tipo de datos VARCHAR2

El tipo de datos VARCHAR2 se utiliza para almacenar cadenas de longitud variable. Esto significa que se define un tamaño máximo, y las cadenas que se inserten en la columna se almacenarán tal y como se proporcionen. No se añadirán espacios al carácter, como el tipo de datos CHAR.

La longitud máxima de un tipo de datos VARCHAR2 es de 4000 bytes. Sin embargo, esto se elevó a 32.767 bytes como una de las nuevas características de Oracle 12c.

Veamos un ejemplo.

INSERT INTO chartest (varchar2_column)VALUES ('klmno');

Ahora, consultemos el resultado.

SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;

Resultado:

VARCHAR2_COLUMN COL_FULL COL_LENGTH COL_DUMP
klmno (klmno) 5 Typ=1 Len=5: 107,108,109,110,111

Puedes ver que la salida es la misma que la del ejemplo VARCHAR. No se han añadido espacios y la longitud es la misma. La única diferencia son los caracteres del código ASCII porque la cadena de entrada era diferente.

Diferencias: CHAR vs VARCHAR vs VARCHAR2

Veamos las diferencias entre estos tres tipos de datos.

  • VARCHAR y VARCHAR2 son exactamente iguales. CHAR es diferente.
  • CHAR tiene un tamaño máximo de 2000 bytes, y VARCHAR/VARCHAR2 tiene un tamaño máximo de 4000 bytes (o 32.767 en Oracle 12c)
  • CHAR no necesita que se especifique un tamaño y tiene un valor por defecto de 1. Es necesario especificar un tamaño con las columnas VARCHAR/VARCHAR2.
  • CHAR rellenará los espacios a la derecha de las cadenas para que coincidan con la longitud de la columna, mientras que VARCHAR/VARCHAR2 no lo hace.

El rendimiento de CHAR, VARCHAR y VARCHAR2 es el mismo. No hay diferencia en el rendimiento con estos tipos de datos. CHAR no es más rápido que VARCHAR2, y VARCHAR2 no es más rápido que CHAR.

Tom Kyte tiene un post en AskTom que explica los detalles técnicos de esto. También explica que un VARCHAR2 con relleno en blanco es exactamente lo mismo que un valor CHAR.

Piensa en esto por un momento.

El relleno en blanco de un valor VARCHAR2 es lo mismo que un valor CHAR.

Los tipos de datos son casi idénticos.

Entonces, ¿cuál de estos tipos de datos debe utilizar?

Como Tom Kyte ha discutido en su foro y en su libro (y estoy de acuerdo), no hay ninguna razón para utilizar nunca el tipo de datos CHAR. VARCHAR2 puede cubrir todas las situaciones en las que se podría considerar un CHAR – incluso un CHAR(1) que es lo mismo que un VARCHAR2(1).

VARCHAR vs VARCHAR2

La diferencia entre VARCHAR y VARCHAR2 en Oracle es que VARCHAR es un tipo de datos estándar ANSI que soporta una distinción entre NULL y cadenas vacías. Oracle aún no ha implementado esta distinción, así que por el momento, VARCHAR y VARCHAR2 son lo mismo. Es más seguro usar VARCHAR2 ya que no quieres que ningún código se rompa si Oracle cambia VARCHAR en el futuro y tu código usa VARCHAR.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.