201 votos

¿Por qué Oracle 9i trata una cadena vacía como NULL?

Sé que considera ' ' como NULL , pero eso no hace mucho para decirme por qué éste es el caso. Como yo entiendo las especificaciones de SQL, ' ' no es lo mismo que NULL , uno es un dato válido, y el otro está indicando la ausencia de esa misma información.

Siéntase libre de especular, pero por favor, indique si es el caso. Si hay alguien de Oracle que se puede comentar, sería fantástico!

207voto

Justin Cave Puntos 114578

Creo que la respuesta es que Oracle es muy, muy viejo.

De vuelta en los viejos días, antes de que existiera un estándar SQL, Oracle hizo la decisión de diseño que las cadenas vacías en VARCHAR/VARCHAR2 columnas estaban NULL y que sólo había un sentido de NULL (hay relacional teóricos que diferenciar entre los datos que no ha sido nunca le pedirá datos en que la respuesta existe, pero no es conocido por el usuario, los datos de las que no hay respuesta, etc. todos los cuales constituyen un cierto sentido de NULL).

En el momento en que el estándar SQL, se acercó y convino en que NULL y la cadena vacía se trata de entidades distintas, ya hay usuarios de Oracle que tenía el código que supone que los dos eran equivalentes. Así Oráculo era, básicamente, a la izquierda con las opciones de romper el código existente, violando el estándar SQL, o la introducción de algún tipo de parámetro de la inicialización de que iba a cambiar la funcionalidad de un número potencialmente grande de las consultas. Violar el estándar SQL (en mi humilde opinión) fue el menos perjudicial de estas tres opciones.

Oracle ha dejado abierta la posibilidad de que el VARCHAR tipo de datos podría cambiar en una futura versión para adherirse al estándar SQL (que es la razón por la que todos los usos VARCHAR2 en Oracle, puesto que los datos del tipo de comportamiento es garantizado a seguir siendo el mismo de avance).

56voto

Brian Puntos 7072

Tom Kyte VICEPRESIDENTE de Oracle:

La longitud CERO varchar es tratada como NULL.

" no es tratada como NULL.

" cuando se asignen a un char(1) se convierte en ' ' (char tipos están en blanco collar de las cadenas).

" cuando se asignen a un varchar2(1) vuelve", que es una longitud cero cadena y una cadena de longitud cero es NULL en Oracle (no es largo ")

18voto

user67897 Puntos 171

Sospecho que esto tiene mucho más sentido si se piensa en Oracle el camino antes de que los desarrolladores probablemente lo hizo-como un glorificado backend para un sistema de entrada de datos. Cada campo en la base de datos corresponde a un campo en un formulario en el que un operador de entrada de datos vio en su pantalla. Si el operador no escriba nada en un campo, ya sea que la "fecha de nacimiento" o "dirección", a continuación, los datos de ese campo es "desconocido". No hay manera de que un operador para indicar que alguien de la dirección es realmente una cadena vacía, y que en realidad no tienen mucho sentido, de todos modos.

17voto

Walter Mitty Puntos 8726

Documentación de Oracle alertas a los desarrolladores de este problema, que se remonta al menos en cuanto a la versión 7.

Oracle elegido para representar a los valores NULOS por el "imposible valor" de la técnica. Por ejemplo, un valor NULL en una numérico ubicación se guardará como "menos cero", un imposible valor. Cualquiera menos ceros que el resultado de los cálculos serán convertidos en positivo cero antes de ser almacenados.

Oracle también se eligió, erróneamente, a considerar el tipo de datos VARCHAR cadena de longitud cero (cadena vacía) a ser un imposible valor, y una elección adecuada para representar NULL. Resulta que la cadena vacía está lejos de ser un imposible valor. Incluso es la identidad bajo la operación de concatenación de cadenas!

Documentación de Oracle advierte a los diseñadores de bases de datos y los desarrolladores de que el futuro de la versión de Oracle podría romper esta asociación entre la cadena vacía y NULO, y romper cualquier código que depende de la asociación.

Existen técnicas para la bandera de los valores NULL otros que imposible valores, pero Oracle no los uso.

(Yo estoy usando la palabra "ubicación" arriba a la media de la intersección de una fila y una columna).

2voto

Alex Kreutznaer Puntos 673

Cadena vacía es igual a NULL simplemente porque es el "mal menor" en comparación con la situación cuando los dos (cadena vacía y nulo) no son los mismos.

En idiomas donde NULL y cadena vacía no son lo mismo, uno tiene que siempre revise ambas condiciones.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X