Elija VARCHAR2(size)
sobre CHAR(size)
, ya que esto es más espacio y tiempo eficiente:
Sorprendentemente o no, CHAR(size)
permite la asignación de cadenas con una longitud más corta que len
size
. En este caso, ORACLE agrega size-len
espacios a la cadena para los tipos de datos CHAR
y VARCHAR
y almacena size
caracteres. El tipo de datos VARCHAR2
viene sin relleno, solo se almacenan len
caracteres.
CREATE TABLE Demo(col1 CHAR(4), col2 VARCHAR2(4));
INSERT INTO Demo (col1, col2) VALUES ('c', 'v');
Como resultado,
col1='c '
(acolchado con 3 espacios finales, ya que el size
de col1
es 4
y la longitud de 'c'
sólo es 1). col1='c'
evalúa FALSO, sólo se TRIM(col1)='c'
evalúa como TRUE,
mientras que
col2='v'
se evalúe como verdadera sin TRIM()
, por lo que la comparación sea más eficiente.
Además, las comparaciones entre dos valores VARCHAR2
fallan rápidamente si sus longitudes difieren (independientemente de su size
). En este caso, no se requieren comparaciones entre caracteres. Con CHAR
y el mismo size
, la verificación de longitud siempre falla debido al relleno. Por lo tanto, se debe comparar cada personaje hasta que se haya alcanzado el primer carácter no coincidente o el final de la cadena, lo que ocurra primero.
Dado que tanto CHAR(size)
y VARCHAR2(size)
no impiden asignaciones de valores más cortos que size
, definir una restricción de longitud si es necesario para asegurar que sólo se valora con una longitud predefinida (que debe ser igual size
) puede ser asignada.
¿Err ... espacios adicionales en los campos de VARCHAR2? ¿O te refieres a las comparaciones OldTable/CHAR = NewTable/VARCHAR2? –