Sé que sí considera '' como NULL
, pero eso no hace mucho para decirme por qué es así. Según entiendo las especificaciones SQL, '' no es lo mismo que NULL
: uno es un dato válido y el otro indica la ausencia de esa misma información.
No dude en especular, pero indique si ese es el caso. Si hay alguien de Oracle que pueda comentarlo, ¡sería fantástico!
Respuestas:
Creo que la respuesta es que Oracle es muy, muy viejo.
En los viejos tiempos antes de que hubiera un estándar SQL, Oracle tomó la decisión de diseño de que las cadenas vacías en
VARCHAR
/VARCHAR2
columnas eranNULL
y que solo había un sentido de NULL (hay teóricos relacionales que diferenciarían entre datos que nunca se han solicitado, datos donde la respuesta existe pero el usuario no la conoce, datos donde no hay respuesta, etc., todos los cuales constituyen algún sentido deNULL
).Para cuando llegó el estándar SQL y acordó que
NULL
y la cadena vacía eran entidades distintas, ya había usuarios de Oracle que tenían un código que suponía que los dos eran equivalentes. Así que, básicamente, Oracle se quedó con las opciones de romper el código existente, violar el estándar SQL o introducir algún tipo de parámetro de inicialización que cambiaría la funcionalidad de un número potencialmente grande de consultas. Violar el estándar SQL (en mi humilde opinión) fue la menos perjudicial de estas tres opciones.Oracle ha dejado abierta la posibilidad de que el
VARCHAR
tipo de datos cambie en una versión futura para cumplir con el estándar SQL (razón por la cual todo el mundo usaVARCHAR2
en Oracle ya que el comportamiento de ese tipo de datos se mantendrá igual en el futuro).fuente
Tom Kyte Vicepresidente de Oracle:
fuente
''
se convierte implícitamente en un VARCHAR2, como elcast('' as char(1)) is null
que es ... sorprendentemente VERDADEROSospecho que esto tiene mucho más sentido si piensas en Oracle como probablemente lo hicieron los desarrolladores anteriores, como un backend glorificado para un sistema de entrada de datos. Cada campo en la base de datos correspondía a un campo en una forma que un operador de entrada de datos vio en su pantalla. Si el operador no escribió nada en un campo, ya sea "fecha de nacimiento" o "dirección", entonces los datos para ese campo son "desconocidos". No hay forma de que un operador indique que la dirección de alguien es realmente una cadena vacía, y eso no tiene mucho sentido de todos modos.
fuente
La documentación de Oracle alerta a los desarrolladores sobre este problema, retrocediendo al menos hasta la versión 7.
Oracle eligió representar NULLS mediante la técnica del "valor imposible". Por ejemplo, un NULL en una ubicación numérica se almacenará como "menos cero", un valor imposible. Cualquier cero negativo resultante de los cálculos se convertirá a cero positivo antes de almacenarse.
Oracle también eligió, erróneamente, considerar la cadena VARCHAR de longitud cero (la cadena vacía) como un valor imposible y una opción adecuada para representar NULL. Resulta que la cadena vacía está lejos de ser un valor imposible. ¡Incluso es la identidad bajo la operación de concatenación de cadenas!
La documentación de Oracle advierte a los diseñadores y desarrolladores de bases de datos que alguna versión futura de Oracle podría romper esta asociación entre la cadena vacía y NULL, y romper cualquier código que dependa de esa asociación.
Existen técnicas para marcar NULLS que no sean valores imposibles, pero Oracle no los usó.
(Estoy usando la palabra "ubicación" arriba para significar la intersección de una fila y una columna).
fuente
La cadena vacía es lo mismo que NULL simplemente porque es el "mal menor" en comparación con la situación cuando las dos (cadena vacía y nula) no son lo mismo.
En los idiomas donde NULL y String vacío no son lo mismo, uno siempre debe verificar ambas condiciones.
fuente
not null
restricción en su columna y verifique solo en la cadena vacía.WHERE Field <> ''
devuelve verdadero solo si el campo no es NULL y no está vacío, en bases de datos con comportamiento ANSI para cadenas vacías.Según los documentos oficiales de 11g
Posibles razones
val IS NOT NULL
es más legible queval != ''
val != '' and val IS NOT NULL
fuente
val <> ''
Ya excluyeNULL
. Quizás quisiste decirval = '' OR val IS NULL
. ¡Pero las cadenas vacías que no se comparan como NULL son útiles !Ejemplo del libro
fuente
Porque no tratarlo como NULL tampoco es particularmente útil.
Si comete un error en esta área en Oracle, generalmente lo nota de inmediato. Sin embargo, en el servidor SQL parecerá funcionar, y el problema solo aparece cuando alguien ingresa una cadena vacía en lugar de NULL (quizás de una biblioteca de cliente .net, donde nulo es diferente de "", pero generalmente los trata de la misma manera )
No digo que Oracle tenga razón, pero me parece que ambas formas son aproximadamente igual de malas.
fuente
De hecho, no he tenido más que dificultades para tratar con Oracle, incluidos los valores de fecha y hora no válidos (no se pueden imprimir, convertir ni nada, solo mirar con la función DUMP ()) que están permitidos a insertar en la base de datos, al parecer, a través de algunos con errores versión del cliente como una columna binaria! ¡Tanto para proteger la integridad de la base de datos!
Manejo de Oracle de enlaces NULL:
http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/
http://jeffkemponoracle.com/2006/02/empty-string-andor-null.html
fuente
En primer lugar, las cadenas nulas y nulas no siempre fueron tratadas como iguales por Oracle. Una cadena nula es, por definición, una cadena que no contiene caracteres. Esto no es lo mismo que un nulo. NULL es, por definición, la ausencia de datos.
Hace cinco o seis años más o menos, la cadena nula fue tratada de manera diferente a nula por Oracle. Mientras que, como nulo, la cadena nula era igual a todo y diferente de todo (lo que creo que está bien para nulo, pero totalmente INCORRECTO para la cadena nula), al menos la longitud (cadena nula) devolvería 0, como debería ser ya que la cadena nula es Una cadena de longitud cero.
Actualmente en Oracle, la longitud (nulo) devuelve nulo, lo que supongo que está bien, pero la longitud (cadena nula) también devuelve nulo, lo cual es totalmente INCORRECTO.
No entiendo por qué decidieron comenzar a tratar estos 2 "valores" distintos de la misma manera. Significan cosas diferentes y el programador debe tener la capacidad de actuar sobre cada uno de diferentes maneras. El hecho de que hayan cambiado su metodología me dice que realmente no tienen idea de cómo deberían tratarse estos valores.
fuente
VARCHAR
campo puede tener un valor (cero o más caracteres) o ningún valor (NULL), punto final.NULL
una cadena de valor nulo, y tal distinción no tiene sentido. Me temo que esta respuesta es una fantasía completa.