The fields are nullable, so they do allow nulls.
Why would MySQL convert "" to 0 instead of NULL?
Is there a way to force it to be NULL instead?
This seems be an on-going bug although it is not considered a bug, such as Bug #73041: Error 1366 when loading null into columns with decimal type using strict mode
According to Oracle's MySQL Documentation
If you are not using strict mode, then whenever you insert an “incorrect” value into a column, such as a NULL into a NOT NULL column or a too-large numeric value into a numeric column, MySQL sets the column to the “best possible value” instead of producing an error:
The following rules describe in more detail how this works:
If you try to store an out of range value into a numeric column, MySQL Server instead stores zero, the smallest possible value, or the largest possible value, whichever is closest to the invalid value.
For strings, MySQL stores either the empty string or as much of the string as can be stored in the column.
If you try to store a string that does not start with a number into a numeric column, MySQL Server stores 0.
That's also in the the regular MySQL Documentation.
With rules like these, that's why a zero(0) pops up for an unspecified DECIMAL value.
If you look back at the bug report, someone got around it when using
\N for null values while loading a CSV file with
LOAD DATA INFILE.