2015.
02.
05
16:11:49
結論から書くと「my.cnf」(もしくは「my.ini」)に
の記述を追加すればOKです。
コンソール上で一時的に制限したいのであれば、
を実行する形でも構いません。
それでは詳細を書いていきます。
まず前提として、MySQLのdate型では年月日の各項目に「0」を指定することができます。
「0000-02-05」「2015-00-05」「2015-02-00」のようなデータを投入できるのです。
例えば、以下の項目を持つテーブル「tbl_test04」があったとしましょう。
このテーブルに対して以下のSQL文を実行すると、エラーにならずにデータが投入されます。
phpMyAdminからみた結果は、こんな感じですφ(--)

date型の項目には「2015-02-00」が入っています。
timestamp型の項目には「0000-00-00 00:00:00」が入りました。
timestamp型は全部「0」になってしまいましたが、
date型の方は指定通りに日付のみが「0」のデータが投入されていますね。
これが嫌だったのです。
日付としては間違っていますからね。
エラーにしたいです。
これが、今回のきっかです。
そんで、あれやこれやと調べた結果、MySQLの設定ファイル(my.cnf、my.ini)に
を記述するか、コンソールでぺちぺちSQL文を発行しているのであれば
を実行すれば良いということが分かりました。
ふむふむ、なるほどね(--)
早速、設定ファイルに設定を追記して、MySQLを再起動して、先程のSQL文を実行してみます。
結果(--)b
エラーになりましたφ(≧▽≦)

しっかり
と怒られています。
やったね♪
MySQLさんのこの仕様は、年月日のいずれかの項目を未指定にしたい場合を考慮しているのでしょう。
特定DBの仕様に依存する設計はあまり好きではないので、
多分、利用する機会はないと思うのですよね。
というわけで、年月日に対する「0」の入力は抑止しておきます。
そんなところで、MySQLの日付型項目に「0」を指定できないようにするの、完了\(--)/
sql-mode="STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE"
の記述を追加すればOKです。
コンソール上で一時的に制限したいのであれば、
SET sql_mode='STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE';
を実行する形でも構いません。
それでは詳細を書いていきます。
まず前提として、MySQLのdate型では年月日の各項目に「0」を指定することができます。
「0000-02-05」「2015-00-05」「2015-02-00」のようなデータを投入できるのです。
例えば、以下の項目を持つテーブル「tbl_test04」があったとしましょう。
項目 | 型 |
---|---|
column_id | int |
column_date | date |
column_timestamp | timestamp |
このテーブルに対して以下のSQL文を実行すると、エラーにならずにデータが投入されます。
insert into tbl_test04 (column_id, column_date, column_timestamp) values(1, '2015-02-00', '2015-00-05 00:00:00');
phpMyAdminからみた結果は、こんな感じですφ(--)

date型の項目には「2015-02-00」が入っています。
timestamp型の項目には「0000-00-00 00:00:00」が入りました。
timestamp型は全部「0」になってしまいましたが、
date型の方は指定通りに日付のみが「0」のデータが投入されていますね。
これが嫌だったのです。
日付としては間違っていますからね。
エラーにしたいです。
これが、今回のきっかです。
そんで、あれやこれやと調べた結果、MySQLの設定ファイル(my.cnf、my.ini)に
sql-mode="STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE"
を記述するか、コンソールでぺちぺちSQL文を発行しているのであれば
SET sql_mode='STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE';
を実行すれば良いということが分かりました。
ふむふむ、なるほどね(--)
早速、設定ファイルに設定を追記して、MySQLを再起動して、先程のSQL文を実行してみます。
結果(--)b
エラーになりましたφ(≧▽≦)

しっかり
#1292 - Incorrect date value: ~
と怒られています。
やったね♪
MySQLさんのこの仕様は、年月日のいずれかの項目を未指定にしたい場合を考慮しているのでしょう。
特定DBの仕様に依存する設計はあまり好きではないので、
多分、利用する機会はないと思うのですよね。
というわけで、年月日に対する「0」の入力は抑止しておきます。
そんなところで、MySQLの日付型項目に「0」を指定できないようにするの、完了\(--)/