8/4/2005

Waar of niet waar?

Filed under: — pinguim @ 12:46 pm

Eigenlijk zou ik het hier toch in het Engels moeten vragen: “To Be or Not To Be; (True or False)?”.
Bij het maken van een nieuwe tabel in MySQL (4.X) viel me op dat ik een kolom van het type aan-uit (aan-af / waar-niet waar / ok-niet ok / 1-0) nodig had; een booleans type dus.
Dat wordt dikwijls voorgesteld door 1 en 0, maar helaas door de geschiedenis van programmeertalen en computeromgevingen is het daarbij niet duidelijk wat de betekenis is: is 1 waar of is 1 vals? Kijk maar naar de antwoordwaarde van een functie in verschillende talen: wat is “gelukt”, de 1 of de 0? In de xbase wereld is het duidelijker met de waarde “True” of .T. en “False” of .F.

Maar de problemen verdwenen (of werden groter?) omdat MySQL blijkbaar helemaal geen “boolean” veldtype heeft in tabellen.(*)

Je zou kunnen werken met het kleinste getal, TINYINT(1), dat dan niet 1 bit ruimte in beslag neemt (met waarde 1 of 0), maar wel een byte, en getallen kan weergeven van 0 tot 255. Als je dan 0 als 0 of onwaar neemt, en “niet 0” of “groter dan 0” als 1 of waar heb je een voorstelling van je bit, maar een rare omdat de waarde 1 helemaal niet sluitend is. Eigenlijk heb je maar 1 toestand en dat is 0, de andere waarde is “niet nul” en van inhoud onbepaald dus (weliswaar van 1-255).

Een andere oplossing is een letter te nemen. Je kan altijd zelf ergens een “j”/”n” inzetten, maar als type voor een veld bestaat het niet, dus dezefde problemen wat de ongedefinieerde waarden betreft. En je moet zelf een interpretatie doen van de betekenis van de aanwezige waarde, waarbij je nog moet letten op hoofdlettergevoeligheid (“J = “j” ? ).

Nog een mogelijkheid is het opsommingstype te nemen “enumerated type”. Dat type kan je voorzien van de mogelijke waarden:
ENUM(‘waarde0’, ‘waarde1’).
Je kan hier ook weer kiezen wat je bij de opsomming gebruikt: de letters “Y” en “N”, of “True” en “False”? Gezien de nadelen van letters hierboven vermeld kijken we naar een getal als alternatief.
ENUM(‘0′,’1’) houdt het klein, en kan nog aangevuld worden met “NOT NULL” en een standaardwaarde naar keuze of noodzaak, zodat geen onbepaalde toestand voorkomt.

(*) Er worden allerlei mogelijke oorzaken genoemd voor het ontbreken van de boolen/bit (databankstandaarden), de officiele reden ken ik niet, en mogelijk is er in nieuwere versies toch al wel zoiets. Er is wel discussie over op de MySQL site te vinden:

http://sunsite.mff.cuni.cz/MIRRORS/ftp.mysql.com/doc/en/Other-vendor_column_types.html

Powered by WordPress