В документации есть небольшая заметка для DATE_FORMAT () о том, что MySQL допускает неполные даты:
Диапазоны для спецификаторов месяца и дня начинаются с нуля из-за
Тот факт, что MySQL позволяет хранить неполные даты, такие как
'2014-00-00'.
Как указано @ wonk0 , MySQL установит недопустимые даты на 0000-00-00 00:00:00
, если ALLOW_INVALID_DATES
не задано. Однако, даже если ALLOW_INVALID_DATES
не задано, вставка действительного года с нулем месяца и дня, по-видимому, не вызывает такого поведения - по крайней мере, в моем тестировании (MySQL 5.1.54-1ubuntu4). Я использовал эту функцию раньше без каких-либо проблем, но до сих пор не смог найти более подробную документацию, которая описывает это поведение полностью.
Сравнение даты и времени также работает должным образом: например, 2011-01-00 > 2011-00-00
и 2011-00-01 > 2011-00-00
делают так, как вы ожидаете.
UPDATE
См. этот ответ (другой Майк) на аналогичный вопрос. Это указывает на выдержку из Полное руководство по MySQL 5 :
В более старых версиях MySQL типы данных DATE и DATETIME делали только
ограниченное количество типов проверки. Значения между 0 и 12 для
месяцев, и 0 и 31 для дней, как правило, допускается Тем не менее, это
ответственность клиентской программы за предоставление правильных данных. (За
Например, 0 является допустимым значением для месяца или дня, чтобы
обеспечить возможность хранения неполных или неизвестных данных.)
Начиная с MySQL 5.0.2, существует более тщательная проверка, поэтому
что только действительные данные могут быть сохранены. Тем не менее разрешены месяц и
дневные значения 0, а также дата 0000-00-00.