NULL significa che il campo NON esiste. Quindi non significa empty (0000-00-00) ma proprio campo mancante. Infatti deve essere identificato in modo apposito.
Un campo NULL valorizzato e poi successivamente azzerato non ritorna NULL, ma diventa campo vuoto o con il valore di default, ma presente. Per tornare NULL deve essere espressamente dichiarato con un update (set campo = NULL)
Meglio usare la data di default 0000-00-00 per una data assente o data non valida e non NULL per una campo con valori temporali.
per evitare di stampare la data 0000-00-00 puoi sempre ricorrere ad una if nella query:
codice:select *, if(data = '0000-00-00', NULL, data) as data from tabella