版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sxllllwd/article/details/102891833
最近,在开发过程中,建表的时候有个涉及到时间的字段。开始时,使用了not null,default值为0000-00-00 00:00:00。但是有个同事说,这个值很有可能不存在,只有部分情况下才会存在,应当使用null,节省空间。开始时,使用not null的原因也是因为之前的一位前辈说数据库建表时,所有字段尽量为not null,并且设默认值。然后通过代码保证。因此有重新查阅博客文档了解其原因。
最后的理解是:mysql所有字段尽可能使用not null。最终时间默认值设为1970-01-01 08:00:00,使用这个的原因是该时间对应的时间戳是0。担心万一有用到时间戳的地方,0000-00-00 00:00:00对应的时间戳是一个负数。
对于MYSQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插入的列插入NULL值,则出现的是当前系统时间,插入空值,则出现0000-00-00 00:00:00。
除非有特别的原因使用NULL值,应该总是让字段保持not null。
空值跟NULL是两个概念
(1)空值不占用空间
(2)MYSQL中NULL其实是占用空间的。
在数据库里是严格区分的,任何数跟NULL进行运算都是NULL, 判断值是否等于NULL,不能简单用=,而要用IS NULL关键字。SQL语句函数中可以使用ifnull()哈数进行处理,判断空字符串用=''或者<>''来进行处理
含有空值的列很难进行查询优化,而且对表索引时不会存储NULL值的,所以如果索引字段可以为NULL,索引的效率会下降很多,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊值或者一个空串代替NULL。(影响索引效率的原因:NULL不是空值,而是要占用空间,所以MYSQL进行比较的时候,NULL会参与字段比较,所以对效率有一部分影响。且B树索引不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。)
联表查询的时候,例如LEFT JOIN table2,如果没有记录,则查找出的table2字段都是NULL,加入table2有些字段本身可以是null,那么除非把table2中not null中的字段查出来,否则就难以区分到底是没有关联记录还是其他情况
数据库的字段设置NOT NULL,仅仅说明该字段不能为NULL,只有在插入数据为NULL的情况下会报错。
在进行count()统计某列的记录数的时候,如果采用NULL值,系统会自动忽略掉,但是空值是会被统计到的。
MYSQL NULL特殊的影响和使用:https://opensource.actionsky.com/20190710-mysql/