MySQL列值NULL和空字符串的区别总结
空字符串 ‘’ 的用法与一般值一样,没有特殊性,所以不对其进行描述。
官网关于 NULL 值的描述:
The NULL value means “no data.” NULL can be written in any lettercase.
NULL 值意味着“没有数据”,虽然空字符串也是没有数据,但是二者是有着明显的区别的,我们可以用Java语言中的 NULL 来理解,Java 语言中 NULL 表示引用没有任何指向,而空字符串表示引用指向空字符串,所以数据库中的 NULL 可以理解为未指定任何值。NULL 不区分大小写。
关于列值 NULL 和空字符串(’’)的区别从以下几个方面分析:
空间占用
NULL 是占用空间的,而 ‘’ 是不占用空间的。
mysql> SELECT LENGTH(NULL), LENGTH(''), LENGTH(' ');
LENGTH(NULL) | LENGTH(’’) | LENGTH(’ ') |
NULL | 0 | 1 |
使用方式
特殊操作
In SQL, the NULL value is never true in comparison to any other value, even NULL. An expression that contains NULL always produces a NULL value.
NULL 与任何值都不相等,包括 NULL 本身,NULL 在比较运算符中操作始终返回 NULL,而不是 0-false、1-true。所以判断列值是否为 NULL,需要使用 IS NULL
和IS NOT NULL
。
mysql> SELECT NULL IS NULL, NULL IS NOT NULL;--1,0
mysql> SELECT NULL=NULL, NULL!=NULL;--NULL,NULL
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);--NULL,NULL,NULL
For sorting with ORDER BY, NULL values sort before other values for ascending sorts, after other values for descending sorts.
使用 ORDER BY
排序时,升序时 NULL 在最前面,降序时在最后面,可以理解为 NULL 值在所有列值里是最小的。
When using DISTINCT, GROUP BY, or ORDER BY, all NULL values are regarded as equal.
当使用 DISTINCT
,GROUP BY
,或者 ORDER BY
时,NULL 值可视为彼此相等。
In MySQL, 0 or NULL means false and anything else means true. The default truth value from a boolean operation is 1.
0 或 NULL 表示 false,而其它值都为 true,默认的 true 的值为1。
Aggregate (summary) functions such as COUNT(), MIN(), and SUM() ignore NULL values. The exception to this is COUNT(*), which counts rows and not individual column values.
聚合函数如 COUNT()
、MIN()
、SUM()
都会忽略 NULL 值,COUNT(*)
除外。
mysql> SELECT COUNT(*),COUNT(username),COUNT(password) FROM user;
COUNT(*) | COUNT(username) | COUNT(password) |
4 | 4 | 3 |
For some data types, MySQL handles NULL values specially. If you insert NULL into a TIMESTAMP column, the current date and time is inserted. If you insert NULL into an integer or floating-point column that has the AUTO_INCREMENT attribute, the next number in the sequence is inserted.
对于一些数据类型,MySQL 对于 NULL 值的处理很特殊。当向 TIMESTAMP
列中插入 NULL 时,当前时间会被插入;当向数值或浮点列插入 NULL,并且这些列声明为 AUTO_INCREMENT
,序列中的下一个数字会被插入。
注意:验证 TIMESTAMP 时,插入 NULL 时数据库仍是 NULL,此时需要设置 explicit_defaults_for_timestamp=false
,这样当插入 NULL 时才会默认设置为当前时间。
You can add an index on a column that can have NULL values if you are using the MyISAM, InnoDB, or MEMORY storage engine. Otherwise, you must declare an indexed column NOT NULL, and you cannot insert NULL into the column.
如果使用的是MyISAM,InnoDB或MEMORY存储引擎,则可以在具有NULL值的列上添加索引。 否则,您必须声明一个索引列 NOT NULL,并且您不能在该列中插入 NULL。
mysql> ALTER TABLE student ADD INDEX index_muti(id, password);-- 复合索引
mysql> ALTER TABLE student ADD INDEX index_sing(password); -- 普通索引
mysql> SHOW INDEXES FROM student;--查看索引
注意:复合索引中,如果第一个顺序的索引列 IS NULL 时或者所有的索引列都为 IS NULL 时,索引失效!
函数 IFNULL
语法:IFNULL(expr1,expr2)
If expr1 is not NULL, IFNULL() returns expr1; otherwise it returns expr2.
mysql> SELECT IFNULL(NULL, 'is null');