sql >> Database teknologi >  >> RDS >> Mysql

MySQL:NULL vs

For MyISAM-tabeller opretter NULL en ekstra bit for hver NULLABLE-kolonne (nullbitten) for hver række. Hvis kolonnen ikke er NULLABLE, er den ekstra smule information aldrig nødvendig. Det er dog polstret til 8 bit bytes, så du altid får 1 + mod 8 bytes for antallet af NULLABLE kolonner. 1

Tekstkolonner er lidt anderledes end andre datatyper. For det første, for "" indeholder tabelindgangen de to byte længder af strengen efterfulgt af bytes af strengen og er en variant længde struktur. I tilfælde af NULL er der ikke behov for længdeoplysninger, men det er alligevel inkluderet som en del af kolonnestrukturen.

I InnoDB tager NULLER ingen plads:De findes simpelthen ikke i datasættet. Det samme gælder for den tomme streng, da dataforskydningerne heller ikke eksisterer. Den eneste forskel er, at NULL'erne vil have NULL-bitten indstillet, mens de tomme strenge ikke vil. 2

Når dataene rent faktisk er lagt ud på disken, fylder NULL og '' NØJST SAMME PLADS i begge datatyper. Men når værdien søges, er det lidt hurtigere at tjekke for NULL end at tjekke for '', da du ikke behøver at overveje datalængden i dine beregninger:du tjekker kun null-bitten.

Som et resultat af mellemrumsforskellene NULL og '', NULL og '' har INGEN Størrelsespåvirkning, medmindre kolonnen er angivet til at være NULLbar eller ej. Hvis kolonnen IKKE er NULL, vil du kun se nogen præstationsforskel i MyISAM-tabeller (og så kan standard NULL naturligvis ikke bruges, så det er et omdiskuteret spørgsmål).

Det virkelige spørgsmål koger så ned til anvendelsesfortolkningen af ​​"ingen værdi angivet her"-kolonner. Hvis "" er en gyldig værdi, der betyder "brugeren indtastede intet her" eller lignende, så er standard NULL at foretrække, da du ønsker at skelne mellem NULL og "", når der indtastes en post, der ikke har nogen data i sig.

Generelt er standard dog i virkeligheden kun nyttig til refaktorisering af en database, når nye værdier skal træde i kraft på gamle data. I så fald afhænger valget igen af, hvordan applikationsdataene fortolkes. For nogle gamle data er NULL perfekt passende og passer bedst (kolonnen eksisterede ikke før, så den har nu NULL-værdi!). For andre er "" mere passende (ofte når forespørgslerne bruger SELECT * og NULL forårsager nedbrudsproblemer).

I ULTRA-GENERELLE VILKÅR (og fra et filosofisk synspunkt) foretrækkes standard NULL for NULLABLE-kolonner, da det giver den bedste semantiske fortolkning af "No Value Specificated".

1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]

2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]



  1. Skift prioritet for en konto i en database-mailprofil (SSMS)

  2. Sådan fungerer REGEXP_INSTR()-funktionen i MySQL

  3. Hvordan ser man CREATE VIEW-koden for en visning i PostgreSQL?

  4. Hvordan kan jeg flette kolonnerne fra to tabeller til ét output?