MySQLのデータベースでアプリケーションを構築していた時の話です。
日付型の項目で値なしで登録しようとすると”(空文字)をいれる仕様に深く考えずしていたのですが、意図しないエラーを起こしていることに気がつきました。
エラーメッセージは記録せずで忘れてしまったのですが、’0000-00-00’は不正なデータであるというメッセージです。
アプリケーションのエラー処理で明示的に’0000-00-00’を指定していませんし、他の環境では見たことがなかったエラーであったため簡単に原因を探りました。
MySQLのデフォルト’ゼロ’値はdate型では’0000-00-00′
MySQLではdate型のカラムに不正な値を入れようとするとデフォルトで’ゼロ’値が設定されます。
date型の場合’ゼロ’値は’0000-00-00’と規定されていますので、上記のテストで”(空文字)を登録しようとした際にアプリケーションは’0000-00-00’を登録しようとしていました。
MySQLのデフォルト設定では’ゼロ’値が許容されない
‘0000-00-00’を登録しようとするのと矛盾して、MySQLはデフォルトだとSQLモードがno_zero_dateになっており’0000-00-00’が入ることを許容しません。
SQLモードはデータ型のチェックを厳しくするために使われる機能で、no_zero_dateはその文字の通り’0000-00-00’の入力を禁止します。
プログラムで明示的にNullを入れるよう修正する
エラーを起こさないためにいくつか方法はありますが、私はプログラムを修正しました。
SQLモードをno_zero_dateから変更して’0000-00-00’を許容することも考えられますがそもそもその値は意図的に入れたものではないですし、いつかデータを別のデータベースに移行するとなった際に障害を起こす可能性がありそうです。
そのため”(空文字)を入れていたコードをNullを入れるように修正しました。
date型に空文字を入れようとしている時点でおかしかったため、エラーのおかげで正しいプログラムに直せました。
