mysql 空值(null)和空字符('')的区别
日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到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)
- 首先比较一下,空字符(”)和空值(null)查询方式的不同:
mysql> select * from test_ab where col_a = '';
+------+-------+-------+
| id | col_a | col_b |
+------+-------+-------+
| 2 | | |
+------+-------+-------+
1 row in set (0.00 sec)
mysql> select * from test_ab where col_a is null;
+------+-------+-------+
| id | col_a | col_b |
+------+-------+-------+
| 3 | NULL | |
| 4 | NULL | 1 |
+------+-------+-------+
2 rows in set (0.00 sec)
由此可见,null和''的查询方式不同。而且比较字符 ‘=’’>’ ‘<’ ‘<>’不能用于查询null,
如果需要查询空值(null),需使用is null 和is not null。
- 第二种比较,参与运算
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)
由此可见,空值(null)不能参与任何计算,因为空值参与任何计算都为空。
所以,当程序业务中存在计算的时候,需要特别注意。
如果非要参与计算,需使用ifnull函数,将null转换为''才能正常计算。
- 第三种比较,统计数量
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)并不会被当成有效值去统计。
同理,sum()求和的时候,null也不会被统计进来,这样就能理解,
为什么null计算的时候结果为空,而sum()求和的时候结果正常了。
结论:
所以在设置默认值的时候,尽量不要用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: 0
mysql> 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)
尽管在存储空间上,在索引性能上可能并不比空字符差,但是为了避免其身上特殊性,给项目带来不确定因素,因此建议默认值不要使用 NULL。
----by 钢铁 648403020@qq.com 09.30.2020
mysql 空值(null)和空字符('')的区别的更多相关文章
- PythonStudy——Python中的None与 NULL(即空字符)的区别
None与 NULL(即空字符)的区别 (1)是不同的一种数据类型 >>>type(None) <class 'NoneType'> >>>type( ...
- Python中的None与 NULL(即空字符)的区别
None是Python的特殊类型,NoneType对象,它只有一个值None. 它不支持任何运算也没有任何内建方法. None和任何其他的数据类型比较永远返回False. None有自己的数据类型No ...
- mysql sql中的一些问题,Null与空字符
mysql中的空值,NULL,空字符 Mysql数据库是一个基于结构化数据的开源数据库.SQL语句是MySQL数据库中核心语言.不过在MySQL数据库中执行SQL语句,需要小心两个陷阱. 陷阱一:空值 ...
- MySql中的count、NULL和空串的区别
**1.count (1).count (*) 与 count (列名) 的区别** 表 count(1) count(*) count (列名) 作用 统计表中的所有的记录数 会统计表中的所有的记录 ...
- 【面试】MySQL 中NULL和空值的区别?
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 01 小木的故事 作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那 ...
- mysql 变量is null 和 not exists区别
问题: 使用游标遍历时,发现使用 select var into tmp where var=? 然后判断if tmp is null时,不能走完所有的遍历.经debug发现, 当var为空时,则跳出 ...
- Mysql的NULL和Empty String
本文基于Mysql5.7版本的参考资料: https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html https://dev.mysq ...
- null和空的区别
python中None和Null的区别 首先了解python对象的概念 python中,万物皆对象,所有的操作都是针对对象的. 那什么是对象?5是一个int对象,‘oblong’是一个str对象,异常 ...
- 用count(*)还是count(列名) || Mysql中的count()与sum()区别
Mysql中的count()与sum()区别 首先创建个表说明问题 CREATE TABLE `result` ( `name` varchar(20) default NULL, `su ...
随机推荐
- Windows servers 2008 环境下, DHCP的搭建。
日常上网,客户端的主机都是使用DHCP动态分配的,家用的路由器就是内置了一个DHCP服务,所以每次分到的IP地址基本的都是192.168.x.x/24 网段的.不过家用的路由器最多只能连十台左右.那么 ...
- js apply() call() bind() 的使用
bind ,call,apply 这三者都是用来改变函数的this对象的指向的. call和apply其实是同一个东西,区别只有参数不同. 其实call和apply ,只要你调用调用一个函数的时候就可 ...
- CSS布局中浮动问题的四种解决方案
一.起因: 子盒子设置浮动之后效果: 由此可见,蓝色的盒子设置浮动之后,因为脱离了标准文档流,它撑不起父盒子的高度,导致父盒子高度塌陷.如果网页中出现了这种问题,会导致我们整个网页的布局紊乱 二.解决 ...
- 你可能不了解的java枚举
枚举在java里也算个老生长谈的内容了,每当遇到一组需要类举的数据时我们都会自然而然地使用枚举类型: public enum Color { RED, GREEN, BLUE, YELLOW; pub ...
- JS深浅拷贝及其实现
基本数据类型和引用数据类型 JS数据分为基本数据类型和引用数据类型.基本数据类型的变量存储在栈中,引用数据类型则存储在堆中,引用数据类型的存储地址则保存在栈中. 下面来看一个小例子 // 基本数据类型 ...
- 写shader小细节——这个会不断更新
这个是因为自己被自己蠢哭了动笔的,里面大概记录自己所犯的错,和一些小知识. 1.有一个错误我经常犯:内部定义的字段没对应开放到编辑器的字段.这个是由于我有点依赖ide写代码的习惯导致,而shader的 ...
- 敏捷转型谁先动:老总,项目经理or团队
摘要: 敏捷转型成功的企业究竟是从老总开始?还是从项目经理开始?还是团队本身具有这种意识?相信还有很多想要转型敏捷的公司都存在这样的疑问. 从06年首届敏捷中国开发者大会召开到现在,敏捷方法在国内的应 ...
- 1008 Elevator (20 分)(模拟)
The highest building in our city has only one elevator. A request list is made up with N positive nu ...
- [MRCTF]Web WriteUp
和武科大WUSTCTF同时打的一场比赛,最后因为精力放在武科大比赛上了,排名13 - -Web题目难度跨度过大,分不清层次,感觉Web题目分布不是很好,质量还是不错的 Ez_bypass 进入题目得 ...
- Java中枚举的用法
public enum Week { DAY1("周一", 0.9), DAY2("周二", 0.9), DAY3("周三", 0.8), ...