developer descargar datos 18c 12c 11g database oracle

database - descargar - ¿Oracle no distingue entre nulos y cadenas vacías?



oracle download (5)

Aparentemente Oracle no parece distinguir entre cadenas vacías y nulos. P.ej

Select name from TABLE_A where id=100; ID NAME 100 null Update TABLE_A set NAME='''' where id=100; SELECT --> ID NAME 100 null SELECT length(NAME) FROM TABLE_A WHERE id=100; null

No puedo pensar en ninguna buena razón por la que Oracle esté diseñado para comportarse de esta manera (¿también lo hace en sqlplus?) Estoy accediendo a través de una interfaz java, el artículo al que se hace referencia utiliza un cliente php).

¿No querría al menos distinguir la longitud 0 de la longitud indefinida? ¿Es esto un problema conocido? Comportamiento intencional para un propósito específico ¿Una larga disputa en la teoría de bases de datos? ¿Lo que da?

(Esto fue provocado por la respuesta de Matt Solnit a esta pregunta ).


@Ian, una respuesta para ti.

Los activadores de Oracle pueden hacer referencia a la tabla en la que se crean:

create table t (id number(10) ); create or replace trigger t_bir before insert on t for each row declare l_id t.id%type; begin select id into l_id from t where id = :new.id; exception when no_data_found then null; end; / SQL> insert into t values (20); 1 row is created. SQL> select * from t; ID ---------- 20



Parece que Oracle ha dicho que este comportamiento puede cambiar en una versión futura. Cuándo y qué versión será no se menciona.

Si tiene acceso a metalink, vea la nota: 1011340.6 (lamentablemente debido a restricciones, no puedo copiar el contenido de la nota aquí)

Si no tiene acceso a metalink, mire lo siguiente de la documentación de la versión 2 de 10g aquí


Por eso las personas inteligentes como Date dicen que NUNCA deberías usar nulls.

(No, tengo que ser preciso. De hecho, es solo una de las casi cientos de razones que ha mencionado en las últimas décadas para respaldar esa afirmación).

EDITAR

De hecho, también quería responder a esto:

"Hacer que VARCHAR haga tal distinción romperá toneladas de código".

Sí, y seguramente, romper al menos el espíritu del estándar reemplazando la "cadena vacía" por nulo en cada actualización es un mal menor.

(Nota: null no es igual a nada, ni siquiera a sí mismo, así que después de asignar la cadena vacía a una columna, Oracle le dará un valor en esa columna que NO es el mismo que el valor que dijo que quería que aparezca allí. Guau.)


Oracle es muy muy viejo.

En los años 80''s cuando se desarrolló (y antes de que existieran los estándares), pensaron que era una buena idea, y dado el modo en que Oracle almacena sus valores, realmente lo fue.

Así es como Oracle almacena los datos (tomados de la documentación ):

No se almacena ningún tipo de datos dentro de los datos, solo la longitud de los datos y los datos en sí.

Si el NULL produce entre dos columnas con valores, se almacena como una columna de significado de un solo byte tiene longitud 0 (en realidad, 0xFF ). Los NULL trailings no se almacenan en absoluto.

Entonces, para almacenar el valor ''test'' , Oracle necesita almacenar 5 bytes: 04 74 65 73 74 .

Sin embargo, para almacenar tanto una cadena vacía como una NULL , Oracle solo necesita establecer la longitud de los datos en 0 .

Muy inteligente si sus datos se almacenan en discos duros de 20 Mb que cuestan 5,000$ cada uno.

Más tarde, cuando aparecieron los estándares, ya no era una buena idea, pero en ese momento ya había muchos códigos confiando en NULL y '''' siendo lo mismo".

Hacer que VARCHAR haga tal distinción romperá toneladas de código.

Para solucionarlo, cambiaron el nombre de VARCHAR a VARCHAR2 (que no forma parte de ningún estándar), establecieron que VARCHAR2 nunca distinguirá entre una cadena NULL y una cadena vacía e instó a todos a usar este tipo de datos.

Ahora probablemente estén esperando a que muera la última persona que usó un VARCHAR en la base de datos Oracle .