sql >> Base de Datos >  >> RDS >> Oracle

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

Oracle es muy muy muy viejo.

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

Así es como Oracle almacena 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 mismos.

Si NULL ocurre entre dos columnas con valores, se almacena como un solo byte, lo que significa que la columna tiene una longitud 0 (en realidad, 0xFF ). NULL final Los correos electrónicos 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 un NULL , Oracle solo necesita establecer la longitud de los datos en 0 .

Muy inteligente si sus datos se almacenarán en 20 Mb discos duros 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 montones, montones de código que se basaban en NULL y '' siendo lo mismo.

Haciendo VARCHAR hacer 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), declaró que VARCHAR2 nunca distinguir entre un NULL y una cadena vacía e instó a todos a usar este tipo de datos en su lugar.

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