Toon posts:

[sql] NULL of ''

Pagina: 1
Acties:
  • 131 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik was wat howtos aan het doornemen over database management in Linux (geen professionele howtos), en daar wordt veel dit soort sql statements gebruikt voor de database opbouw door een aantal van die howtos:

code:
1
veldnaam varchar(128) NOT NULL default ''


Nu ik heb nog geen benches opgezocht, maar wat nut heeft dit nu :? Als je dan toch niets in je defaultwaarde steekt, kan je dan niet beter in je veld NULL waardes toelaten ?? Ik heb nochtans die gewoonte ... Het blijft een string. Bij Integers kan je der nog een '0' in steken ipv NULL waardes toe te laten, wat in sommige gevallen aangeraden is.

Ben wel eens benieuwd of er veel mensen zijn die dit zo doen. Of waarschijnlijk ben ik gewoon helemaal verkeerd in men redeneringen 8)7

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

mysql zeker?

die kan daar niet echt mee overweg. Als je NOT NULL opgeeft en geen default geeft ie je alsnog de default '' |:(
En nee, dat hoort niet en nee dat zou niet mogen, maar ja mysql doet het wel...

Het schijnt overigens wel sneller te zijn om een lege string te hebben dan om NULL velden toe te laten, dat vanwege de lengte van het record die minder sterk varieert ofzoiets. De precieze redenatie weet ik ook niet :)

[ Voor 35% gewijzigd door ACM op 22-12-2002 01:27 ]


Verwijderd

Als we niet kijken naar het db programma dat je gebruikt maar puur naar waarom NULL of NOT NULL toepassen zou ik denken dat je een keuze maakt tussen verplichte velden en niet verplichte velden.

Bijvoorbeeld:
firstname CHAR(64) NOT NULL default ''
middlename CHAR(64) NULL

De eerste zou in een gebruikerstabel een verplicht veld zijn aangezien je de voornaam en achternaam van een gebruiker wil kennen. Een lege naam wil je waarschijnlijk ook niet maar je kan nogal moeilijk 'Tom' als default instellen. Lege namen moet je dus met je programmacode opvangen.
Nu de tweede gaat om de middennaam. Ik heet bijvoorbeeld Sebastian Gozin en heb geen middennaam. Mijn middennaam is niet '', ik heb er gewoon geen. Dus kan je dat veld leeg laten.

Je kan vaak denken dat het verschil niet interessant is maarja er is toch een klein verschil tussen ja, nee en niet gespecifiërd. Bijvoorbeeld de prijs van een product kan 100 euro zijn of als je de lijst hebt aangevuld maar er zijn nog geen prijzen dan zou de prijs NULL zijn en niet 0 want dan kost het product niets.

[ Voor 3% gewijzigd door Verwijderd op 22-12-2002 01:52 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

kortom, de semantische betekenis van een lege string ( '' ) en een NULL waarde verschilt. Ik kan zo 1-2-3 geen voorbeeld bedenken, maar ik kan me voorstellen dat er situaties zijn waarin je wel toelaat dat een veld een lege string heeft, maar niet NULL mag zijn, omdat een lege string betekent "ik heb wel een waarde, maar die is leeg", en NULL "ik heb geen waarde"

Nu is het in het geval van een NOT NULL veld dus zo dat deze niet "geen waarde" mag hebben, maar wel een lege string mag zijn. Nou wordt dit in MySQL altijd een beetje lastig, omdat NULL/ NOT NULL feitelijk de enige constraint (afgezien van UNIQUE) is die je op een veld kan zetten, en er daarom vrij weinig aan semantiek aan de database-layout ontleend kan worden...

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 17:16

Tomatoman

Fulltime prutser

drm schreef op 22 december 2002 @ 02:02:
kortom, de semantische betekenis van een lege string ( '' ) en een NULL waarde verschilt. Ik kan zo 1-2-3 geen voorbeeld bedenken, [...]
Voorbeeld? Neem een tabel met de drie velden Voornaam, Tussenvoegsels en Achternaam. Nu wil je daar de volledige naam uit halen, inclusief spaties tussen de woorden. In pseudocode:
code:
1
2
3
4
5
IF (Tussenvoegsels IS NULL)
THEN
  Result = Voornaam + SPACE + Achternaam
ELSE
  Result = Voornaam + SPACE + Tussenvoegsels + SPACE + Achternaam
Dergelijke code geeft onterecht een dubbele spatie tussen voor- en achternaam als in het veld Tussenvoegsels een lege string is ingevuld in plaats van een NULL-waarde.

Een goede grap mag vrienden kosten.


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

mja, maar dat is een beetje verkeerd-om redeneren, imho... Je schrijft doorgaans code nadat je vastgesteld hebt hoe 't in mekaar moet zitten, niet andersom.... ajbwib....

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
> Jah. Was ek vergeten te vermelden 8)7 offtopic: was naar mysql support voor posftix aant zoeken.
Verwijderd schreef op 22 december 2002 @ 01:52:
Je kan vaak denken dat het verschil niet interessant is maarja er is toch een klein verschil tussen ja, nee en niet gespecifiërd. Bijvoorbeeld de prijs van een product kan 100 euro zijn of als je de lijst hebt aangevuld maar er zijn nog geen prijzen dan zou de prijs NULL zijn en niet 0 want dan kost het product niets.
> Nou je haalt hier een voorbeeld aan waar ik er geen kon vinden :) Hier vind ik ook ook logisch dat er een verschil is.
drm schreef op 22 December 2002 @ 02:02:
kortom, de semantische betekenis van een lege string ( '' ) en een NULL waarde verschilt. Ik kan zo 1-2-3 geen voorbeeld bedenken, maar ik kan me voorstellen dat er situaties zijn waarin je wel toelaat dat een veld een lege string heeft, maar niet NULL mag zijn, omdat een lege string betekent "ik heb wel een waarde, maar die is leeg", en NULL "ik heb geen waarde"
> Ik kan je in je redenering perfect volgen, maar praktisch gezien heeft dit toch geen enkel nut :? Als je op dat veld geen enkele keer queries gaat uitvoeren met een where clausule die op NULL waardes controleert, ga je dus altijd ofwel een lege string ofwel de NULL value terug krijgen die op dat moment dan dezelfde betekenis krijgt. Terwijl bij een default '0' er toch nog een verschil is met NULL. Ik zie het nut daar gewoon niet van in :? Als je zegt dat je op dat veld alleen maar de rijen zonder NULL waardes afhaalt krijgt dat een andere betekenis natuurlijk ...

We spreken hier natuurlijk wel over MySQL en niet een serieuzere database, maar is het in zulk geval niet handiger om je code dan zo te schrijven dat er altijd een waarde voorzien is voor dat veld (en op dat veld NOT NULL aan te zetten) ?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

drm schreef op 22 december 2002 @ 02:02:
omdat een lege string betekent "ik heb wel een waarde, maar die is leeg", en NULL "ik heb geen waarde"
NULL kan ook dingen betekenen als "ik heb wel een geldige waarde, maar die is niet bekend", "het veld is niet van toepassing in deze tuple"
Bijvoorbeeld een database met personeels gegevens, en dat het telefoon nummer veld. Iemand kan wel telefoon hebben, maar het nummer nog niet aan de administratie hebben door gegeven. Iemand anders heeft ook telefoon, maar een geheim nummer. Weer een ander heeft helemaal geen telefoon. Dat zijn allemaal NULL waarden. Het tel nr '0' (of '') kan ook bestaan, maar is dan gewoon een geldig nummer dat gedraaid kan worden. Wordt dus lastig bij de lege string, maar integer 0 kan wel.
Overigens heeft sql ook een 3 waardige logica, waardoor je moet uitkijken met nulls:
Think of true = 1; false = 0, and unknown = 1/2. Then:

AND = min.

OR = max.

NOT(x) = 1 – x.

Some Key Laws Fail to Hold

Example: Law of the excluded middle, i.e.,

p OR NOT p = TRUE

For 3-valued logic: if p = unknown, then left side = max(1/2,(1–1/2)) = 1/2 ≠ 1.

Like bag algebra, there is no way known to make 3-valued logic conform to all the laws we expect for sets/2-valued logic, respectively.

[ Voor 4% gewijzigd door Zoijar op 22-12-2002 15:12 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Zoijar:
NULL kan ook dingen betekenen als "ik heb wel een geldige waarde, maar die is niet bekend", "het veld is niet van toepassing in deze tuple"

Bijvoorbeeld een database met personeels gegevens, en dat het telefoon nummer veld. Iemand kan wel telefoon hebben, maar het nummer nog niet aan de administratie hebben door gegeven. Iemand anders heeft ook telefoon, maar een geheim nummer. Weer een ander heeft helemaal geen telefoon. Dat zijn allemaal NULL waarden. Het tel nr '0' (of '') kan ook bestaan, maar is dan gewoon een geldig nummer dat gedraaid kan worden. Wordt dus lastig bij de lege string, maar integer 0 kan wel.
Ja, maar dat kun je an sich niet van een NULL veld afleiden, lijkt mij :)
Overigens heeft sql ook een 3 waardige logica, waardoor je moet uitkijken met nulls:
[...]

Daar heb ik idd nog nooit in die mate bij stil gestaan... 't vreemde in die zin is ook dat wanneer je een NULL "waarde" met elke andere waarde vergelijkt zonder IS te gebruiken, altijd NULL als returnwaarde heeft....
code:
1
2
3
4
5
6
7
8
9
10
SELECT 
   ''    =  NULL     as string_cmp_null,     # NULL
   NULL  =  NULL     as null_cmp_null,       # NULL
   NULL  =  0        as null_cmp_zero,       # NULL
   NULL  IS NULL     as null_is_null,        # 1
   0     =  ''       as zero_cmp_string,     # 1
   0     =  '0'      as zero_cmp_zerostring, # 1
   (1=0) =  NULL     as false_cmp_null,      # NULL
   (1=0) =  (1=1)    as false_cmp_true       # 0
   # etcetera
maf :D

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

code:
1
veldnaam varchar(128) NOT NULL default ''


Bovenstaande code wordt meestal gebruikt als een veld aan een bestaande tabel wordt toegevoegd, want dan moet er een default waarde voor alle bestaande rijen worden gegeven.
bijvoorbeeld:
code:
1
2
3
ALTER TABLE tabel
ADD
  veldnaam varchar(128) NOT NULL default('')


Bij het maken van een nieuwe tabel kun je die default('') weglaten, maar je kunt hem ook laten staan.
Het voordeel van het laten staan is dat je dan bij een INSERT geen waarde voor dat veld hoeft mee te geven omdat die dan standaard op '' wordt gezet.
Alleen de vraag is of je dat wel wilt.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

drm schreef op 23 December 2002 @ 09:14:

Ja, maar dat kun je an sich niet van een NULL veld afleiden, lijkt mij :)
Nee dat klopt. Maar het zal dus wel in je database ontwerp gedocumenteerd moeten worden. Iets wat dus ook wel niet gedaan zal worden ;)
maf :D
Maar wel logisch ;) Afhangend van je axiomas dan...

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Zoijar schreef op 23 december 2002 @ 12:20:Nee dat klopt. Maar het zal dus wel in je database ontwerp gedocumenteerd moeten worden. Iets wat dus ook wel niet gedaan zal worden ;)
Daar lijkt 't idd niet op :)
Maar wel logisch ;)
Jawel, maar heb er nooit bij stil gestaan ...
Afhangend van je axiomas dan...
axiomas :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

axi'o·ma
het axioma; de axioma's/axiomata

1 niet bewezen, maar als grondslag aanvaarde stelling
2 onbetwistbare waarheid

Kortom, de basis aannames van je logica.

[ Voor 6% gewijzigd door Zoijar op 23-12-2002 14:02 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

mja, ik was er idd achter toen ik begreep dat axiomas het meervoud was van axioma, en dat ik dat wel kon vinden op vandale.nl :D

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 17:16

Tomatoman

Fulltime prutser

axioma's dus :)

Een goede grap mag vrienden kosten.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Tsja ik ben meer gewend om engels te typen...
Pagina: 1