日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符。
空字符('')和空值(null)表面上看都是空,其实存在一些差异:

定义:

  • 空值(NULL)的长度是NULL,不确定占用了多少存储空间,但是占用存储空间的
  • 空字符串('')的长度是0,是不占用空间的

通俗的讲:

空字符串('')就像是一个真空转态杯子,什么都没有。
空值(NULL)就像是一个装满空气的杯子,含有东西。
二者虽然看起来都是空的、透明的,但是有着本质的区别。

区别:

  1. 在进行count()统计某列时候,如果用null值系统会自动忽略掉,但是空字符会进行统计。不过count(*)会被优化,直接返回总行数,包括null值。
  2. 判断null用is nullis not null,SQL可以使用ifnull()函数进行处理;判断空字符用=''或者!=''进行处理。
  3. 对于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)

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
  3. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  4. android 中使用TextView实现分段显示不同颜色的字符串
  5. android中json文件的写法
  6. exp: 修改Android中strings.xml文件, 动态改变数据
  7. 【【【常用的ubuntu第三方工具及android命令(自存档)】】】二
  8. Android(安卓)中数据库查询方法 query() 中的 select
  9. android中SqLite query中用selectionArgs处理字符传值

随机推荐

  1. 在jQuery返回的HTML中找到控件
  2. 2017.4.9 JQuery学习续写
  3. 当AJAX响应来自PHP文件时,如何显示以消息
  4. 关于jQuery Themeroller主题,我在哪里可以
  5. 设置活动类并将其从所有其他类中删除
  6. 关于jQuery获取html标签自定义属性值或da
  7. jQuery 异步上传插件 Uploadify302 使用
  8. jQuery无法识别前缀为“/”的类名
  9. jQuery之mouseover与mouseenter以及mouse
  10. 如何使用智能管理员的注销警告弹出窗口来