sql >> Database teknologi >  >> RDS >> Oracle

Er denne implementering SQL-92 i overensstemmelse?

Nej, Oracles behandling af nuller er idiosynkratisk, forskellig fra alle andres og ikke i overensstemmelse med ANSI-standarderne. Til Oracles forsvar har det sandsynligvis løst og var forpligtet til denne behandling længe før der var en ANSI-standard at være i overensstemmelse med!

Det hele starter fra det faktum, at Oracle gemmer strenge med et tegnantal efterfulgt af strengdataene. En NULL er repræsenteret af et tegnantal på nul uden følgende strengdata - hvilket er nøjagtigt det samme som en tom streng (''). Oracle har simpelthen ikke en måde at skelne dem på.

Dette fører til noget skæv adfærd, såsom dette sammenkædningstilfælde. Oracle har også en funktion LENGTH til at returnere længden af ​​en streng, men denne er blevet defineret på en modsat måde, så LENGTH('') returnerer NULL ikke nul. Så:

LENGTH('abc') + LENGTH('') IS NULL

LENGTH('abc' || '') = 3

hvilket forekommer mig at overtræde grundlæggende matematiske principper.

Selvfølgelig bliver Oracle-udviklere så vant til dette, at mange af os ikke engang kan se noget forkert eller mærkeligt ved det - nogle vil faktisk hævde, at resten af ​​verden er forkert, og at en tom streng og en NULL er det samme!



  1. Når jeg undslipper alle input, efterlader den nogle gange skråstreger (\) i strengen og indsætter den i databasen. Hvorfor sker det, og hvordan kan jeg løse dette?

  2. Få styr på native Oracle Connection i Hibernate 4 for at køre en lagret proc

  3. Integration af værktøjer til at administrere PostgreSQL i produktion

  4. Hvad er betydningen af ​​<> i mysql-forespørgsel?