The trouble with pretending that NULL is FALSE is that NULL is neither FALSE nor TRUE.
If you have a column null_or_true
in a table some_table
, you might write a trio of SELECT statements:
SELECT COUNT(*) FROM some_table;
SELECT COUNT(*) FROM some_table WHERE null_or_true;
SELECT COUNT(*) FROM some_table WHERE NOT null_or_true;
The first gets the total number of rows, say 30. The second gets the number of rows where the value in null_or_true
is TRUE; this might return 15. The third query returns the number of rows where null_or_true
is FALSE, but if you only store NULL and not FALSE in those columns, it will return 0. To count the other 15 rows, you'd have to write a variant on:
SELECT COUNT(*) FROM some_table WHERE null_or_true IS NULL;
This counter-intuitive behaviour means you will get wrong answers from people who can be forgiven for being confused by the data stored in your table.
Therefore, you should go with:
NOT NULL DEFAULT FALSE
The other path leads to madness, sooner or later.