プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
MySQL5.5、日付型の項目の「年」「月」「日」それぞれに「0」を指定できないようにする
結論から書くと「my.cnf」(もしくは「my.ini」)に

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_idint
column_datedate
column_timestamptimestamp

このテーブルに対して以下のSQL文を実行すると、エラーにならずにデータが投入されます。

insert into tbl_test04 (column_id, column_date, column_timestamp) values(1, '2015-02-00', '2015-00-05 00:00:00');

phpMyAdminからみた結果は、こんな感じですφ(--)

20150205-01.png


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

エラーになりましたφ(≧▽≦)

20150205-02.png


しっかり

#1292 - Incorrect date value: ~

と怒られています。
やったね♪

MySQLさんのこの仕様は、年月日のいずれかの項目を未指定にしたい場合を考慮しているのでしょう。
特定DBの仕様に依存する設計はあまり好きではないので、
多分、利用する機会はないと思うのですよね。
というわけで、年月日に対する「0」の入力は抑止しておきます。

そんなところで、MySQLの日付型項目に「0」を指定できないようにするの、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● MySQL  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事