La diferencia entre CHAR, VARCHAR y VARCHAR2

Oracle tiene tres tipos de datos para almacenar cadenas. – CHAR, VARCHAR y VARCHAR2. ¿En qué se diferencian? ¿Cuándo se debe utilizar uno u otro?

Averigüemos las respuestas en este artículo.

Lo más sencillo primero: VARCHAR y VARCHAR2 son lo mismo. Pero que esto hoy en día – esto podría cambiar. Echa un vistazo a la documentación de Oracle 10G Release 2:

No uses el tipo de datos VARCHAR. Utilice el tipo de datos VARCHAR2 en su lugar. Aunque el tipo de datos VARCHAR es actualmente sinónimo de VARCHAR2, está previsto redefinir el tipo de datos VARCHAR como un tipo de datos independiente utilizado para cadenas de caracteres de longitud variable comparadas con una semántica de comparación diferente.

En este artículo, VARCHAR2 se utiliza para significar tanto VARCHAR como VARCHAR2 ya que son equivalentes hoy en día.

¿En qué se diferencian entonces CHAR y VARCHAR2?

La diferencia es que CHAR(n) será SIEMPRE de n bytes de longitud. Si la longitud de la cadena es <n, se rellenará en blanco al insertarla para asegurar una longitud de n. Un VARCHAR2(n), por otro lado, tendrá una longitud de 1 a n bytes. Una cadena más corta almacenada como VARCHAR2 NO será rellenada en blanco.

Por ejemplo, suponga que almacena la cadena ‘ORATABLE’ en un campo CHAR(20) y un campo VARCHAR2(20). El campo CHAR utilizará 22 bytes (2 bytes para la longitud inicial). El campo VARCHAR2 utilizará 10 bytes solamente (8 para la cadena, 2 bytes para la longitud principal).

Para resumir, CHAR es VARCHAR2 rellenado a su longitud máxima.

¿Cómo afecta esta diferencia a los SQLs?

Esto cambia la forma en que las cadenas son emparejadas en CHAR vs VARCHAR2. Compruébalo en acción:

SQL> create table strings 2 (colchar char (20) 3 , colvarchar varchar2 (20));Table created.SQL>SQL> insert into strings 2 (colchar, colvarchar) 3 values 4 ('ORATABLE', 'ORATABLE');1 row created.SQL> -- Define a string variableSQL> var str varchar2(20)SQL> -- Give it a value with length < 20SQL> exec :str := 'ORATABLE'PL/SQL procedure successfully completed.SQL> -- Exact string match with CHARSQL> -- No result found!SQL> select 'found' found_flag 2 from strings 3 where colchar = :str;no rows selectedSQL> -- Padded string match with CHARSQL> -- Now it finds itSQL> select 'found' found_flag 2 from strings 3 where colchar = rpad(:str,20);FOUND-----found

Así que ves, el relleno con espacios en blanco hace una diferencia para que la cadena CHAR se empareje con un parámetro de longitud variable. Para obtener una coincidencia, es necesario rpad el valor o rtrim la columna.

No hay tal requisito con VARCHAR2:

SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found

¿Cuándo debemos usar CHAR, cuando VARCHAR2?

Si sólo usas VARCHAR2 e ignoras CHAR, harás la vida mucho más simple. No hay ninguna diferencia entre los dos, excepto que CHAR utiliza más espacio cuando sus cadenas no son siempre de la longitud máxima fija. Además, CHAR lleva a más confusión en la escritura de consultas.

Yo uso CHAR como columnas de base de datos sólo para valores del tipo S/N. (No hay ningún tipo de datos de columna BOOLEAN, ¿recuerdas?) Esto actúa como un marcador para una columna de tipo «bandera» o «interruptor» – pero podría haber sido igualmente VARCHAR2.

Para todas las demás cadenas, es VARCHAR2.

Resumen

Al considerar los tipos de datos de Oracle CHAR, VARCHAR y VARCHAR2, recuerde que:

  • VARCHAR y VARCHAR2 son lo mismo, pero la función de VARCHAR podría cambiar en el futuro. Utilice VARCHAR2.
  • CHAR y VARCHAR2 se diferencian en que CHAR rellena en blanco sus cadenas para que tengan su máxima longitud. VARCHAR2 no hace ningún relleno en blanco.
  • Debido a lo anterior, las consultas que implican la comparación de cadenas en una columna CHAR requieren más cuidado – un VARCHAR2 comparado con CHAR necesita ser rpad-ded para obtener un éxito.
  • ¡Hay que repetirlo: use VARCHAR2!

Deja una respuesta

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