移転しました。

MySQLで桁溢れや不正日付などのINSERT/UPDATEをエラーで落とす

MySQLはでフォルトだと桁溢れや不正日付などを極力エラーにならないように処置する。例えば、VARCHAR(5)なカラムに「abcdefg」をINSERTすると「abcde」が挿入される(警告は出る)。
元々、Oracleを使っていたので、MySQLのこの挙動に最初は驚いた。不正な日付でも「0000-00-00 00:00:00」で(警告とはいえ)成功してしまう。個人的には不正な値はそもそもINSERT/UPDATEに失敗して欲しいと思うところ。
ただ、これはMySQLSQLモードを利用することで、ちゃんとエラーで落とせるみたい。

Strict Mode は、MySQL が無効または不明な入力値をどのように処理するかを制御します。何らかの理由で値は無効になることがあります。たとえば、カラムに対して違うデータの入力、範囲を超える入力などがあった場合です。値が不明であるということは、挿入する新規のレコードに、カラム値がない場合で、定義に、明示的な DEFAULT 節がないときです。

トランザクション テーブルでは、無効または不明な値がクエリにある場合はエラーになります。これは、STRICT_ALL_TABLES または STRICT_TRANS_TABLES のどちらかのモードが有効になっている場合に起こります。クエリは中断、そしてロールバックの対象になります。

4.2.6. SQL モード

意図したデータではないかもしれないが稼働し続ける方が良いのか、バッサリとエラーで落として良いのか、状況によるけれども自分で作るときは今度からこれを利用してみよう。