mysql中的NULL值
在实际应用中,mysql的NULL值并没有发现有什么用处,但是却有一些不好的地方,需要来规避。
1、NULL和空值
NULL表示没有设置任何的值,空值其实是有值的,只是值为空而已。
mysql> select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+
| NULL | 0 | 1 |
+--------------+------------+-------------+
2、查询
CREATE TABLE `tb_test` (
`a` varchar(255) NOT NULL,
`b` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT tb_test VALUES (1,NULL);
INSERT tb_test VALUES ('',"2");
INSERT tb_test VALUES ("3","3");
使用is null / is not null
来判断字段的值是否为NULL。
SELECT * FROM tb_test where a is NULL;
SELECT * FROM tb_test where a is not NULL;
3、COUNT()聚合查询
COUNT并不会统计值为NULL的行。
mysql> SELECT count(a) FROM tb_test;
+----------+
| count(a) |
+----------+
| 3 |
+----------+
mysql> SELECT count(b) FROM tb_test;
+----------+
| count(b) |
+----------+
| 2 |
+----------+
4、使用IFNULL函数
IFNULL
的作用是为查询的字段设置默认值,如果该字段的值为NULL的话。
mysql> SELECT IFNULL(b,"aaaa") from tb_test WHERE b is null;
+------------------+
| IFNULL(b,"aaaa") |
+------------------+
| aaaa |
+------------------+
5、索引字段说明
ALTER TABLE tb_test ADD INDEX index_all (a, b);
ALTER TABLE tb_test add INDEX index_b(b);
当然索引的规则是比较复杂的,在不同条件下表现形式又不一样,只能说在正常的查询中,NULL值不会使索引失效。
6、自增操作
增加一个字段
`c` int(11) DEFAULT NULL
mysql> update tb_test set c=c+1 where a="1";
Query OK, 0 rows affected
Rows matched: 1 Changed: 0 Warnings: 0
发现并没有执行任何操作。
综合以上,在创建表结构的时候不要设置默认值为NULL,免得出现奇怪的问题不好排查。