Open Source Web Development Tutorials - Dev Shed
NULLと空文字列
(2009/02/06公開)
NULLとMySQL
では、MySQL関連のNULLを見てみよう。原則は同じだが応用方法が異なる。
この場合、NULLは「失われた不明の値」という意味で、ほかの値とは多少異なった扱いがなされる。NULLを試すためには、=、<、や <>のようは比較演算子を使うことはできない。使うことができるのは、nullとis not null演算子のみとなる。
mysql> select '' IS NULL, '' IS NOT NULL;
+------------+----------------+
| '' IS NULL | '' IS NOT NULL |
+------------+----------------+
| 0 | 1 |
+------------+----------------+
それで、NULLを単にNULLと定義することにより、列の中に入力するものが何であっても、それが空文字列("")でも、NULLではなくなる。
では次に、問題になりうる例を考えてみよう。検証のため、「example」という名の1つのテーブルから見てみよう。
「example」テーブルの構造は以下のとおり。
CREATE TABLE `example` (
`id` int(2) NOT NULL auto_increment,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
このコードの書き方だと、NULLではなく空文字列をテーブルに挿入することができる。上の「example」テーブルの場合、次のクエリを実行するとこうなる。
$query = "INSERT INTO `example` ( `id` , `name` )
VALUES (
'', '$var') ";
$nameが空の場合、NULL値ではなく空文字列を挿入したことになる。更新されたテーブルは次のようになる。
mysql> select * from example;
+----+------+
| id | name |
+----+------+
| 2 | |
+----+------+
1 row in set (0.00 sec)
上のテーブルをもう一度例として、次のクエリを実行したとしよう。
$query = "INSERT INTO `example`(`id`) values('') " ;
ここで、「name」列にはいるものは、結果的にSQLのモードに左右される。
・SQLのstrictモードが使用可能になっていない場合、MySQLは暗黙上のデフォルトの列のデータの種類をその列に設定する。
・strictモードが使用可能になっている場合は、トランザクションのテーブルの場合はエラーを発生し、命令文はロールバックされる。非トランザクションのテーブルの場合もエラーは発生するものの、複数行の命令文の2番目以降の行で発生した場合は、それより前の行はすでに挿入されていることになる。
SQLがstrictモードでない場合の、MySQLデータタイプの暗黙上デフォルト設定は以下のとおり。
・数値の場合、デフォルトは0。ただし、AUTO_INCREMENT属性で宣言された整数値や浮動小数の場合は例外として、順番上次の値がデフォルトとなる。
・TIMESTAMP以外の日付や時刻のタイプの場合、デフォルトはそのタイプに対応するゼロ値。テーブルの中の最初のTIMESTAMP列の場合、デフォルト値は現在の日付と時刻となる。
・ENUM以外の文字列タイプの場合、デフォルト値は空文字列。ENUMの場合、デフォルトは最初の列挙値。
・BLOB列やTEXT列にはデフォルト値は指定できない。
ほとんどの場合、SQLモードはstrictモードにはなってないことだろう。デフォルトではstrictモードはonになっていないからだ。その場合、やはりNULL値ではなく空文字列を入力したことになる。
更新された値は以下の通り。
mysql> select * from example;
+----+------+
| id | name |
+----+------+
| 2 | |
| 3 | |
+----+------+
2 rows in set (0.00 sec)
上の2つの例では、NULL値と勘違いされかねない空文字列を入力した。もっとややこしいことに、実際にNULL値を後から列に入力することもありうる。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








