Potresti valutare l'uso della sintassi più "lunga", al posto di usare DEFAULT:
Codice:
INSERT INTO prodotti (nome, descrizione, sottocategoria) VALUES ("nome del prodotto", "descrizione del prodotto", "sottocategoria del prodotto");
un po' di lavoro in più, ma ti permette di evitare problemi simili in futuro. Ci sono degli esempi interessanti su w3school.
Nel caso tu ne sappia qualcosa in più sarei grato se riuscissi ad inserire un ulteriore commento.
La differenza tra '', DEFAULT o NULL a volte può essere sottile... ad esempio, in una tabella con un campo string dotato di valore di default:
Codice:
...
string VARCHAR(32) DEFAULT 'nessuna stringa',
...
viene inserita una stringa vuota (''):
Codice:
INSERT INTO ... (string) VALUES ('');
Può risultare ambiguo: voglio inserire esattamente la stringa vuota, oppure voglio che sia usato il valore di default? Lo stesso usando NULL: voglio indicare che il valore è nullo, oppure voglio che sia usato quello di default? Usando la parola chiave DEFAULT non c'è ambiguità.
Quando ci sono queste situazioni "poco chiare" c'è il rischio che il comportamento cambi da una versione di MySQL all'altra, come è successo a te.
A prescindere dalla questione sul DEFAULT, però, il codice resta sensibile all'ordine delle colonne della tabella. Ad esempio, questa tabella:
Codice:
CREATE TABLE my_table (
id INT PRIMARY KEY,
name VARCHAR(32)
);
e quest'interrogazione:
Codice:
INSERT INTO my_table(4, 'nome');
Se la tabella viene modificata aggiungendo una colonna dopo id e prima di nome:
Codice:
ALTER TABLE my_table ADD codice_fiscale VARCHAR(32) DEFAULT 'NA' AFTER id;
l'interrogazione di prima non funziona più.
Al contrario, usando
Codice:
INSERT INTO my_table (id, nome) VALUES (4, 'nome');
l'interrogazione funziona sia prima che dopo la modifica.
In ogni caso l'ultima parola spetta sempre alla documentazione ufficiale (per chi ha l'ardire di districarsi là in mezzo!).