Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle não distingue entre nulos e strings vazias?


Oracle é muito muito muito velho.

De volta aos 80's quando foi desenvolvido (e antes de haver quaisquer padrões) eles acharam que era uma boa ideia, e então deram o caminho Oracle armazena seus valores, realmente era.

Veja como o Oracle armazena dados (retirados da documentação ):



Nenhum tipo de dados é armazenado nos dados, apenas o comprimento dos dados e os próprios dados.

Se o NULL ocorre entre duas colunas com valores, é armazenado como um único byte, o que significa que a coluna tem comprimento 0 (na verdade, 0xFF ). À direita de NULL s não são armazenados.

Então, para armazenar o valor 'test' , Oracle precisa armazenar 5 bytes:04 74 65 73 74 .

No entanto, para armazenar uma string vazia e um NULL , Oracle só precisa definir o comprimento dos dados para 0 .

Muito inteligente se seus dados forem armazenados em 20 Mb discos rígidos que custam 5,000$ cada.

Mais tarde, quando os padrões apareceram, não era mais uma boa ideia, mas naquela época já havia muitos e muitos códigos contando com NULL e '' sendo a mesma coisa.

Fazendo VARCHAR fazer essa distinção quebrará toneladas de código.

Para corrigi-lo, eles renomearam VARCHAR para VARCHAR2 (que não faz parte de nenhum padrão), afirmou que VARCHAR2 será nunca distinguir entre um NULL e uma string vazia e pediu a todos que usassem esse tipo de dados.

Agora eles provavelmente estão esperando pela última pessoa que usou um VARCHAR em Oracle banco de dados para morrer.