En respuesta a una serie de dudas que me surgieron al adaptar una base de datos usada en las prácticas de una asignatura, pongo por aquí las conclusiones sacadas.
CHAR
Un atributo de tipo char admite una longitud máxima de menos de 255 caracteres en SQL estándar. Sin embargo, en Oracle podemos permitirnos hasta 2000 bytes. Si no especificamos longitud se asume que será un único byte.
Es de longitud fija, esto quiere decir que si definimos un atributo como char(30), aunque luego le asignemos un valor de 10 caracteres de longitud, se usan los 30 caracteres que hemos introducido, completaandose los 10 caracteres ntorducidos con 20 espacios a su derecha hasta alcanzar los 30 caracteres que hemos declarado.
Al ser de longitud fija, si lo usamos para guardar cadenas de distinta longitud acabaremos desperdiciando espacio,
pero en cambio las búsquedas se realizarán más rápidamente ya que no hay que buscar el fin de cadena, si no que a priori ya se sabe que son bloques de p.ej. 30 caracteres de longitud.
VARCHAR2
Es un tipo de datos propio de Oracle. A diferencia de char es de longitud variable, por lo que no se desperdicia tanto
espacio, pero las búsquedas son más lentas. Puede contener cadenas de hasta 4000 bytes. En disco se guarda la longitud
de la cadena, además del propio valor de la cadena.
En Oracle 8i, 9i y 10g al insertar una cadena vacía realmente se inserta un nulo en vez de una cadena vacía. Desde Oracle8 VARCHAR es un alias para VARCHAR2, aunque esto puede cambiar en futuras versiones y Oracle recomienda usar VARCHAR2 y no VARCHAR.
Al ser de longitud variable pueden dar lugar a la fragmentación del espacio al modificar sus valores,
lo que repercute en el acceso a los datos, o bien en el mantenimiento de éstos ya que habrá que defragmentarlos.
VARCHAR
En Oracle ahora mismo es un alias para varchar2. En otros sistemas (es estándar ANSI SQL) varchar admite hasta 2000 caracteres. Es de longitud fija, pero a diferencia de char no se completan las cadenas con espacios, sino con nulos, lo que facilita p.ej. las comparaciones.
Al ser de longitud fija se desperdiciará espacio cuando se almacenen cadenas de longitud menor a la declarada.
Es hasta un 50% más lento que char.
Tanto VARCHAR como VARCHAR2 presentan dos variantes llamadas respectivamente NVARCHAR y NVARCHAR2. La finalidad de estas variantes es proporcionar una forma de declarar atributos que hacen uso de otro juego de caracteres diferente a aquel con el que se ha definido la base de datos. Oracle 9i al menos permite especificar la longitud a reservar para estos atributos en caracteres en vez de en bytes.
LONG
Permite hasta 2 gigabytes de datos y presenta ciertas restricciones en su uso con ciertos operadores (p.ej. con WHERE). Oracle no permite la creación de índices sobre este tipo de atributos. Es preferible usar un CLOB
CLOB
Character Large Object. Para cadenas de más de 4000 gigabytes. Serviría para guardar documentos. Presenta dos variantes, la NCLOB que proporciona una forma de usar un NLS alternativo al de la base de datos, al igual que NCHAR y NVARCHAR2, y la BLOB (Binnary LOB) para almacenar datos binarios (imágenes, sonidos, etc.)
Oracle 9i incorpora muchas funciones para LONG adaptadas a los LOBs, así como facilidades para migrar tablas con atributos LONG a atributos LOB mediante alter table.
En todos los casos al intentar insertar una cantidad de datos mayor a la reservada se producirá un error en tiempo de ejecución.
Resumido de aquí: