Cuando ” no es lo mismo que NULL…

Todo aquel que trabaja con Oracle sabe que una cadena de longitud 0 se considera NULL ( por cierto, que esto me ha dado más de un quebradero de cabeza trabajando con java y Oracle, pero eso es otra historia…)

Así pues, en teoría, en PL/SQL es lo mismo declarar una cadena como como ” o como NULL. ¿Sí? Veamos:

carlos@bd01.xxxxxxxx> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Solaris: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

carlos@bd01.xxxxxxxx> DECLARE
  2          v_cadena VARCHAR2(10);
  3  BEGIN
  4
  5     DBMS_OUTPUT.PUT_LINE('Sin inicializar. v_cadena: *'||
  6                            NVL(v_cadena,'NULL')||'*');
  7     DBMS_OUTPUT.PUT_LINE(' ');
  8
  9     v_cadena := NULL;
 10     DBMS_OUTPUT.PUT_LINE('Asignando NULL. v_cadena: *'||
 11                           NVL(v_cadena,'NULL')||'*');
 12     DBMS_OUTPUT.PUT_LINE(' ');
 13
 14     v_cadena := '';
 15     DBMS_OUTPUT.PUT_LINE('Asignando ''''. v_cadena: *'||
 16                           NVL(v_cadena,'NULL')||'*');
 17     DBMS_OUTPUT.PUT_LINE(' ');
 18  END;
 19  /
Sin inicializar. v_cadena: *NULL*
Asignando NULL. v_cadena: *NULL*
Asignando ''. v_cadena: *NULL*

Procedimiento PL/SQL terminado correctamente.

Pues parece que sí. Pero…

carlos@bd01.xxxxxxxx> DECLARE
  2          v_cadena CHAR(10);
  3  BEGIN
  4
  5     DBMS_OUTPUT.PUT_LINE('Sin inicializar. v_cadena: *'||
  6                           NVL(v_cadena,'NULL')||'*');
  7     DBMS_OUTPUT.PUT_LINE(' ');
  8
  9     v_cadena := NULL;
 10     DBMS_OUTPUT.PUT_LINE('Asignando NULL. v_cadena: *'||
 11                           NVL(v_cadena,'NULL')||'*');
 12     DBMS_OUTPUT.PUT_LINE(' ');
 13
 14     v_cadena := '';
 15     DBMS_OUTPUT.PUT_LINE('Asignando ''''. v_cadena: *'||
 16                           NVL(v_cadena,'NULL')||'*');
 17     DBMS_OUTPUT.PUT_LINE(' ');
 18  END;
 19  /
Sin inicializar. v_cadena: *NULL*
Asignando NULL. v_cadena: *NULL*
Asignando ''. v_cadena: *          *

Procedimiento PL/SQL terminado correctamente.

¡Pues resulta que no! Al menos no en todos los casos. Las asignaciones de cadenas vacías (”) a variables CHAR son rellenadas a blancos hasta la longitud declarada de la cadena, por lo que no es lo mismo asignar ” que asignar NULL. Mientras que para cadenas VARCHAR2 la asignasión de ” o NULL sí es equivalente, dando como resultado el mismo NULL.

Saludos.

Carlos.

Anuncios

4 respuestas a Cuando ” no es lo mismo que NULL…

  1. ivan dice:

    Una pregunta

    A la hora de desarrollar una aplicación donde las busquedas (parciales o totales) sobre campos de cadena de carácteres son el pan de cada dia, que tipo de dato es mas recomendable por rendimiento y costo: varchar2 o char?

  2. carlosal dice:

    Iván:

    En general, aunque siempre hay excepciones, se utilizarán datos VARCHAR2, ya que ocupan menos espacio y evitan el engorro de tener que tener en cuenta el relleno a blancos que lleva implícito el uso del tipo CHAR.

    Saludos.

    Carlos.

  3. ivan dice:

    Carlos:

    una replica, antes el criterio del espacio era muy importante pero ahora con la capacidad casi ‘ilimitada’ de almacenamiento se podria sacrificar este en pos de rendimiento.. he leido varios libros que recomiendan char versus varchar mas no explican el porque.

  4. carlosal dice:

    Iván:

    Me gustaría saber qué libros son esos… No, en serio: te voy a dar sólo dos argumentos:

    Si tienes una columna VARCHAR2(4000) que contiene un texto de 100 caracteres y una columna CHAR(4000) con el mismo texto ¿Con cuál de las dos crees tú que será más rápida una llamada a INSTR()?

    De esas dos columnas ¿Cual crees tú que ocupará más espacio en ‘BUFFER CACHE’?

    Saludos.

    Carlos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: