区分MySQL中的空值(null)和空字符('')
16lz
2021-12-16
日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符。
空字符('')和空值(null)表面上看都是空,其实存在一些差异:
定义:
- 空值(NULL)的长度是NULL,不确定占用了多少存储空间,但是占用存储空间的
- 空字符串('')的长度是0,是不占用空间的
通俗的讲:
空字符串('')就像是一个真空转态杯子,什么都没有。
空值(NULL)就像是一个装满空气的杯子,含有东西。
二者虽然看起来都是空的、透明的,但是有着本质的区别。
区别:
- 在进行count()统计某列时候,如果用null值系统会自动忽略掉,但是空字符会进行统计。不过count(*)会被优化,直接返回总行数,包括null值。
- 判断null用
is null
或is not null
,SQL可以使用ifnull()
函数进行处理;判断空字符用=''
或者!=''
进行处理。 - 对于timestamp数据类型,插入null值会是当前系统时间;插入空字符,则出现
0000-00-00 00:00:00
实例:
- 新建一张表test_ab,并插入4行数据。
CREATE TABLE test_ab (id int,col_a varchar(128),col_b varchar(128) not null);insert test_ab(id,col_a,col_b) values(1,1,1);insert test_ab(id,col_a,col_b) values(2,'','');insert test_ab(id,col_a,col_b) values(3,null,'');insert test_ab(id,col_a,col_b) values(4,null,1);mysql> select * from test_ab;+------+-------+-------+| id | col_a | col_b |+------+-------+-------+| 1 | 1 | 1 || 2 | | || 3 | NULL | || 4 | NULL | 1 |+------+-------+-------+4 rows in set (0.00 sec)
- 第二种比较,参与运算
mysql> select col_a+1 from test_ab where id = 4;+---------+| col_a+1 |+---------+| NULL |+---------+1 row in set (0.00 sec)mysql> select col_b+1 from test_ab where id = 4;+---------+| col_b+1 |+---------+| 2 |+---------+1 row in set (0.00 sec)
- 第三种比较,统计数量
mysql> select count(col_a) from test_ab;+--------------+| count(col_a) |+--------------+| 2 |+--------------+1 row in set (0.00 sec)mysql> select count(col_b) from test_ab;+--------------+| count(col_b) |+--------------+| 4 |+--------------+1 row in set (0.00 sec)
结论:
所以在设置默认值的时候,尽量不要用null当默认值,如果字段是int类型,默认为0;如果是varchar类型,默认值用空字符串('')会更好一些。带有null的默认值还是可以走索引的,只是会影响效率。当然,如果确认该字段不会用到索引的话,也是可以设置为null的。
在设置字段的时候,可以给字段设置为 not null ,因为 not null 这个概念和默认值是不冲突的。我们在设置默认值为('')的时候,虽然避免了null的情况,但是可能存在直接给字段赋值为null,这样数据库中还是会出现null的情况,所以强烈建议都给字段加上 not null。
类似这样的:
mysql> alter table test_ab modify `col_b` varchar(128) NOT NULL DEFAULT '';Query OK, 0 rows affected (0.00 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> desc test_ab;+-------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+--------------+------+-----+---------+-------+| id | int | YES | | NULL | || col_a | varchar(128) | YES | | NULL | || col_b | varchar(128) | NO | | | |+-------+--------------+------+-----+---------+-------+3 rows in set (0.00 sec)
更多相关文章
- MySQL系列多表连接查询92及99语法示例详解教程
- Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
- MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
- android 中使用TextView实现分段显示不同颜色的字符串
- android中json文件的写法
- exp: 修改Android中strings.xml文件, 动态改变数据
- 【【【常用的ubuntu第三方工具及android命令(自存档)】】】二
- Android(安卓)中数据库查询方法 query() 中的 select
- android中SqLite query中用selectionArgs处理字符传值