sql >> Database >  >> RDS >> Oracle

Oracle maakt geen onderscheid tussen nulls en lege strings?

Oracle is heel erg erg oud.

Terug in 80's toen het werd ontwikkeld (en voordat er normen waren), dachten ze dat het een goed idee was, en toen werd Oracle slaat zijn waarden op, echt waar.

Hier is hoe Oracle slaat gegevens op (overgenomen uit de documentatie ):

Er wordt geen datatype in de data opgeslagen, alleen de datalengte en de data zelf.

Als de NULL komt voor tussen twee kolommen met waarden, het wordt opgeslagen als een enkele byte, wat betekent dat de kolom lengte heeft 0 (eigenlijk 0xFF ). Navolgende NULL s worden helemaal niet opgeslagen.

Dus om de waarde op te slaan 'test' , Oracle moet 5 bytes opslaan:04 74 65 73 74 .

Om echter zowel een lege string als een NULL . op te slaan , Oracle hoeft alleen de gegevenslengte in te stellen op 0 .

Heel slim als je gegevens op 20 Mb moeten staan harde schijven die 5,000$ kosten elk.

Later, toen de standaarden verschenen, was het niet zo'n goed idee meer, maar tegen die tijd waren er al heel veel code die afhankelijk waren van NULL en '' hetzelfde zijn.

VARCHAR maken om zo'n onderscheid te maken, breekt ton van code.

Om het te repareren, hernoemden ze VARCHAR naar VARCHAR2 (die geen deel uitmaakt van een standaard), verklaarde dat VARCHAR2 zal nooit onderscheid maken tussen een NULL en een lege string en drong er bij iedereen op aan om in plaats daarvan dit datatype te gebruiken.

Nu wachten ze waarschijnlijk op de laatste persoon die een VARCHAR . heeft gebruikt in Oracle database om te sterven.



  1. PDF-bestanden maken met PLSQL in Oracle

  2. Python import MySQLdb-fout - Mac 10.6

  3. Een rapport maken met de rapportwizard in Microsoft Access

  4. Hoe gebruik ik op delete cascade in mysql?