いまさらながらNULLと0と空白（恥）

４月入社の新入社員たちが、
以前作った現行社内システム（LAMP）[90年代～とある中小ICT企業の社内システム](https://qiita.com/k_iwamoto/items/fec69ce6ff88cecae21d) [二代目社長 社内システム開発のもっと内実](https://qiita.com/k_iwamoto/items/356688ef329ad0558704)のリプレースや機能追加をしているのですが、
本当にすごい勢いでやってくれているので、
正直慌てて、もちろん真面目に、
【過去色々やり過ぎて、とっ散らかったサグラダ・ファミリア システム（禁句）】を、
最低限、新人の悪い見本にならないよう見直しています。
[フレームワーク無しHTMLテーブルをBootstrapで再現する場合](https://qiita.com/k_iwamoto/items/6afc721caafd17597f44)など。

DBも、私の過去のいいかげんな所業により、NULLと0と空白がグダグダになってる…
猛省とともに、初心に立ち返りまとめておきます。

##こういうDBテーブルです

```SQL
> CREATE TABLE `samptable`(id INT  PRIMARY KEY, name TEXT, birth INT);
Query OK, 0 rows affected (0.01 sec)

> SHOW COLUMNS FROM `samptable`;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
| name  | text    | YES  |     | NULL    |       |
| birth | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
```

##通常のINSERT

```SQL
> INSERT INTO `samptable`VALUES(1111, '例 太朗', 1427814000);
Query OK, 1 row affected (0.00 sec)

> SELECT * FROM `samptable`;
+------+------------+------------+
| id   | name       | birth      |
+------+------------+------------+
| 1111 | 例 太朗    | 1427814000 |
+------+------------+------------+
```

通常「*（ワイルドカード）」は使ってはダメ。

##int型のカラムに''をINSERTすると、警告を発しながら0になる

```SQL
> INSERT INTO `samptable`VALUES(2223, '例 次郎', '');
Query OK, 1 row affected, 1 warning (0.00 sec)

> SELECT * FROM `samptable`;
+------+------------+------------+
| id   | name       | birth      |
+------+------------+------------+
| 1111 | 例 太朗    | 1427814000 |
| 2223 | 例 次郎    |          0 |
+------+------------+------------+
```

##int型のカラムにNULLをINSERTすると、NULLになる

```SQL
> INSERT INTO `samptable`VALUES(3333, '例 三郎', NULL);
Query OK, 1 row affected (0.00 sec)

> SELECT * FROM `samptable`;
+------+------------+------------+
| id   | name       | birth      |
+------+------------+------------+
| 1111 | 例 太朗    | 1427814000 |
| 2223 | 例 次郎    |          0 |
| 3333 | 例 三郎    |       NULL |
+------+------------+------------+
```

##text型のカラムに''をINSERTすると、空になる

```SQL
> INSERT INTO `samptable`VALUES(4444, '', NULL);
Query OK, 1 row affected (0.00 sec)

> SELECT * FROM `samptable`;
+------+------------+------------+
| id   | name       | birth      |
+------+------------+------------+
| 1111 | 例 太朗    | 1427814000 |
| 2223 | 例 次郎    |          0 |
| 3333 | 例 三郎    |       NULL |
| 4444 |            |       NULL |
+------+------------+------------+
```

##text型のカラムにNULLをINSERTすると、NULLになる

```SQL
> INSERT INTO `samptable`VALUES(5555, NULL, NULL);
Query OK, 1 row affected (0.00 sec)

> SELECT * FROM `samptable`;
+------+------------+------------+
| id   | name       | birth      |
+------+------------+------------+
| 1111 | 例 太朗    | 1427814000 |
| 2223 | 例 次郎    |          0 |
| 3333 | 例 三郎    |       NULL |
| 4444 |            |       NULL |
| 5555 | NULL       |       NULL |
+------+------------+------------+
```

##プライマリーキーだけでINSERTすると、他のカラムは勝手にNULLになる

```SQL
> INSERT INTO `samptable` (`id`)VALUES(6666);
Query OK, 1 row affected (0.00 sec)

> SELECT * FROM `samptable`;
+------+------------+------------+
| id   | name       | birth      |
+------+------------+------------+
| 1111 | 例 太朗    | 1427814000 |
| 2223 | 例 次郎    |          0 |
| 3333 | 例 三郎    |       NULL |
| 4444 |            |       NULL |
| 5555 | NULL       |       NULL |
| 6666 | NULL       |       NULL |
+------+------------+------------+
```

##当たり前だけど、これは怒られてNG

```SQL
> UPDATE `samptable` SET birth = 'あああ' WHERE `id` = 6666;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 1
```

##int型のカラムに''をUPDATEすると、警告を発しながら0になる

```SQL
> UPDATE `samptable` SET birth = '' WHERE `id` = 6666;
Query OK, 1 row affected, 1 warning (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 1

> SELECT * FROM `samptable`;
+------+------------+------------+
| id   | name       | birth      |
+------+------------+------------+
| 1111 | 例 太朗    | 1427814000 |
| 2223 | 例 次郎    |          0 |
| 3333 | 例 三郎    |       NULL |
| 4444 |            |       NULL |
| 5555 | NULL       |       NULL |
| 6666 | NULL       |          0 |
+------+------------+------------+
```

##text型のカラムに''をUPDATEすると、空になる

```SQL
> UPDATE `samptable` SET name = '' WHERE `id` = 6666;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

>SELECT * FROM `samptable`;
+------+------------+------------+
| id   | name       | birth      |
+------+------------+------------+
| 1111 | 例 太朗    | 1427814000 |
| 2223 | 例 次郎    |          0 |
| 3333 | 例 三郎    |       NULL |
| 4444 |            |       NULL |
| 5555 | NULL       |       NULL |
| 6666 |            |          0 |
+------+------------+------------+
```

##text型のカラムにNULLをUPDATEすると、NULLになる

```SQL
> UPDATE `samptable` SET name = NULL WHERE `id` = 6666;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

SELECT * FROM `samptable`;
+------+------------+------------+
| id   | name       | birth      |
+------+------------+------------+
| 1111 | 例 太朗    | 1427814000 |
| 2223 | 例 次郎    |          0 |
| 3333 | 例 三郎    |       NULL |
| 4444 |            |       NULL |
| 5555 | NULL       |       NULL |
| 6666 | NULL       |       NULL |
+------+------------+------------+
```