SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
てるてる動画

【MySQL】date型、datetime型に対して is null すると?

1、テーブルを作る

date型でNULLは許可。

create table test_date (dt date);

2、データを挿入

NULL、0000-00-00、普通の日付、不正な日付を挿入してみる。

insert into test_date values (NULL);
insert into test_date values (0);
insert into test_date values ('2010-02-03');
insert into test_date values ('2010-02-00');
insert into test_date values ('2010-02-30');

3、データを確認

本題と関係ないですが、2010-02-30は0000-00-00になるんですね。

select * from test_date

+------------+
| dt         |
+------------+
| [NULL]     |
| 0000-00-00 |
| 2010-02-03 |
| 2010-02-00 |
| 0000-00-00 |
+------------+

4、null許可のdate型カラムで is null すると

ごく普通の結果が返ってきます。

select * from test_date where dt is null

+--------+
| dt     |
+--------+
| [NULL] |
+--------+

5、not null のdate型カラムで is null すると

仕様を知らないと、ちょっと意外な結果が返ってきます。

alter table test_date change dt dt date not null;

select * from test_date where dt is null

+------------+
| dt         |
+------------+
| 0000-00-00 |
| 0000-00-00 |
| 0000-00-00 |
+------------+

探すと、マニュアル書いてあります。

http://dev.mysql.com/doc/refman/5.1/ja/comparison-operators.html

NOT NULL として宣言された DATE および DATETIME カラムでは、次のようなステートメントを使用することで、特殊な日付 ‘0000-00-00’ を検索することができます :

SELECT * FROM tbl_name WHERE date_column IS NULL

ODBC は ‘0000-00-00’ をサポートしていないため、ODBC アプリケーションのあるものの作動にこれが必要になります。

0000-00-00 は引っかかるのですが、2010-02-00 は引っかからない。これもまたややこしい。

このような仕様に依存しないように設計したいものです。

関連するメモ

コメント