Open Source Web Development Tutorials - Dev Shed
NULLと空文字列
(2009/02/06公開)
MySQLでNULLを扱う
もっとよく分かるようにNULL値を入力してみよう。そのためのクエリは次のようになる。
// before inserting a value alter the column to accept null values
ALTER TABLE `example` CHANGE `name` `name` VARCHAR( 20 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL
$query = "INSERT INTO `example` (`id`, `name` ) values ('', null) " ;
mysql> select * from example;
+----+------+
| id | name |
+----+------+
| 2 | |
| 3 | |
| 4 | NULL |
+----+------+
3 rows in set (0.00 sec)
ではここで、NULL値を持つすべての組(タプル)を選択するとしよう。その場合のクエリは次のとおり。
Select * from example where name is null ;
ID = 4が返される。
mysql> Select * from example where name is null ;
+----+------+
| id | name |
+----+------+
| 4 | NULL |
+----+------+
1 row in set (0.03 sec)
Select * from example where name = '' ;
ID=1,2が返される。
mysql> Select * from example where name = '' ;
+----+------+
| id | name |
+----+------+
| 2 | |
| 3 | |
+----+------+
2 rows in set (0.00 sec)
実際には、空っぽである3つすべての値を得たいものだろう。そのためには、次のようなクエリを使う。
Select * from example where name is null OR name = '';
mysql> Select * from example where name is null OR name = '';
+----+------+
| id | name |
+----+------+
| 2 | |
| 3 | |
| 4 | NULL |
+----+------+
3 rows in set (0.00 sec)
このコードは、扱うべきなのがNULLか空文字列なのかが分からない場合にSQLで処理するための安全な方法といえる。
終わりに近づいてきたが、もう1つだけコツをお知らせしておこう。もう1つ、IDつきの行をNULLとして挿入する。
mysql> INSERT INTO `example` (`id`, `name` ) values ('', 'finalrow');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from example where id IS NULL;
+----+----------+
| id | name |
+----+----------+
| 5 | finalrow |
+----+----------+
1 row in set (0.00 sec)
奇妙に見えるが、これには理由がある。DelphiやAccessなどいくつかのODBCアプリケーションの場合、次のクエリで新しく挿入された行を探し出すことができる。
SELECT * FROM tbl_name WHERE auto IS NULL;
--http://dev.mysql.com/doc/mysql/en/ODBC_and_last_insert_id.html
同じ命令文をこの後に実行すると、予想通りの結果となる。
mysql> select * from example where id IS NULL;
Empty set (0.00 sec)
これで、NULLと空文字列の違いと、PHPとMySQLで安全にそれらを扱う方法をご理解していただけたことだろう。ではまた!
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.








