MySQLの日付と時刻型のカラムには不正な値が格納できる?

★4.1
http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-types.html

暦の上で存在しない日付や、月日が0の値が許容される。

MySQL では、'厳密' には正しくない一部の日付値(1999-11-31 など)も格納可能であることに注意してください。 これは、日付チェックはアプリケーションで実行されるので SQL サーバ側で行う必要はない、という前提に立っているためです。日付チェックを '迅速' に行うために、MySQL では、指定された月が 0 〜 12 の範囲にあるかどうかと、指定された日付が 0 〜 31 の範囲にあるかどうかのみチェックします。これらの範囲に 0 が含まれている理由は、MySQL では、DATE または DATETIME カラムの日の値または月日の値がゼロである日付の格納が許容されているためです。これは、誕生日を格納する必要があるアプリケーションで正確な日付がわからないときなどに非常に役立ちます。この場合、単に 1999-00-00 や 1999-01-00 などとして、日付を格納します(このような日付を指定した場合、DATE_SUB() や DATE_ADD などの関数によって正しい値が返ると想定することはできません)。

★5.1
http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-types.html

正しくない値はエラーや警告になるが、SQLモードの設定により厳密には正しくない値を
許容することもできる。

MySQLは不正データを挿入すると警告かエラーを発生させます。SQLモードを適切な値に設定する事で、MySQLがサポートする日付のタイプを指定する事ができます。(詳しくは 「SQL モード」 をご確認ください。)ALLOW_INVALID_DATES SQLモードを利用する事によって、'1999-11-31' のような確実な日付をMySQLに指定する事ができます。これは、ユーザーが将来の処理の為にデータベースの中で指定した「間違っているかもしれない」値を格納したい時に便利です。このモードの時MySQLは、月は0から12の範囲、日付は0から31の範囲でしか確認しません。MySQLが DATE か DATETIME カラムの中で日付、または月と日付がゼロであるデータの格納を許可するので、これらの範囲はゼロを含むと定義されています。これは、誕生日など、正確な日付が不明なデータを格納する必要があるアプリケーションに大変便利です。その場合は、'1999-00-00' や '1999-01-00' 等のようにデータを格納するだけでよいのです。このようなデータを格納する時は、DATE_SUB() や DATE_ADD など、正確な日付を必要とする物のように、正確な結果を期待する事はできません。(もし日付にゼロを利用したくないのであれば、NO_ZERO_IN_DATE SQLモードを利用する事ができます。)

MySQLではまた、'0000-00-00' を 「ダミーの日付」 (もしNO_ZERO_DATE SQLモードを利用していないのであれば)として格納する事ができます。これは、NULL 値を利用するよりも便利な事が多いです。(データとインデックスの容量も少量で済みます。)