Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL:NULL срещу

За таблици MyISAM, NULL създава допълнителен бит за всяка колона NULLABLE (нулевият бит) за всеки ред. Ако колоната не е NULLABLE, допълнителният бит информация никога не е необходим. Това обаче е подплатено до 8 битови байта, така че винаги получавате 1 + mod 8 байта за броя на колоните NULLABLE. 1

Текстовите колони са малко по-различни от другите типове данни. Първо, за "" записът в таблицата съдържа дължината от два байта на низа, последвани от байтовете на низа и е структура с вариантна дължина. В случай на NULL няма нужда от информация за дължината, но тя все пак е включена като част от структурата на колоните.

В InnoDB NULLS не заемат място:те просто не съществуват в набора от данни. Същото важи и за празния низ, тъй като отместванията на данните също не съществуват. Единствената разлика е, че NULL ще имат зададен бит NULL, докато празните низове нямат. 2

Когато данните действително са изложени на диск, NULL и '' заемат ТОЧНО СЪЩОТО МЯСТО и в двата типа данни. Въпреки това, когато стойността се търси, проверката за NULL е малко по-бърза от проверката за '', тъй като не е нужно да вземете предвид дължината на данните при изчисленията си:проверявате само нулевия бит.

В резултат на разликите в NULL и '' пространството, NULL и '' нямат ВЛИЯНИЕ НА РАЗМЕРА, освен ако колоната не е посочена като NULL или не. Ако колоната НЕ е NULL, само в таблиците MyISAM ще видите някаква разлика в производителността (и тогава, очевидно, NULL по подразбиране не може да се използва, така че това е спорен въпрос).

Истинският въпрос след това се свежда до интерпретацията на приложението на колоните "не е зададена стойност тук". Ако "" е валидна стойност, което означава "потребителят не е въвел нищо тук" или нещо подобно, тогава NULL по подразбиране е за предпочитане, тъй като искате да правите разлика между NULL и "", когато е въведен запис, който няма данни в него.

Като цяло обаче по подразбиране е полезно само за рефакторинг на база данни, когато трябва да влязат в сила нови стойности върху стари данни. В този случай, отново, изборът зависи от това как се интерпретират данните от приложението. За някои стари данни NULL е напълно подходящо и най-добре пасва (колоната не е съществувала преди, така че сега има стойност NULL!). За други "" е по-подходящо (често когато заявките използват SELECT * и NULL причиняват проблеми със срив).

В УЛТРА-ОБЩИ ТЕРМИНИ (и от философска гледна точка) се предпочита NULL по подразбиране за NULLABLE колони, тъй като дава най-добрата семантична интерпретация на „Няма посочена стойност“.

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

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да предотвратя SQL инжектирането в PHP?

  2. Мога ли да изпълня множество заявки, разделени с точка и запетая, с MySQL Connector/J?

  3. Как да коригирам MySQL грешка 1064

  4. Примерна база данни на MySQL

  5. Използваните оператори SELECT имат различен брой колони (REDUX!!)