MySQL默认值NULL、空值、Empty String的区别,如何选择?

最近复盘下系统的数据库设计,发现大量查询条件判断null or 不等于空字符串。思来想去,觉得以前大意啦。仔细学习下。

我们可以看到,默认值的设置主要分为三种:

空值,空白,即什么都不填,等同于NULL(设计表结构时保存空值会自动变成NULL),当然也可以手动输入默认值。
NULL。
Empty String,空字符串,可以理解为0字节长度的字符串,等同于单引号''和双引号""。

其中,空值 = NULL,Empty String = 空字符串 = ‘’ = “”。

那么问题来了,当设定某一个字段的默认值的时候,是设定空值、NULL还是Empty String呢?
先说结论:

建议不要使用NULL或空值,String类型的字段可以设置默认为Empty String(即空字符串’’),Int类型的字段可以设置默认为0。

尤其是使用php做接口开发时,设置字段类型为not null可以避免产生很多问题,如果查询出null数据直接返回给Android或IOS,而移动端又没有进行处理的话,程序就会报错。所以为了避免这种情况,一定要在服务端数据库层面从根源上解决这个问题。

因为空值 = NULL,所以谈论区别时只比较NULL和空字符’'串即可。
区别:

1、NULL是占用磁盘空间的(并不是数据本身占用空间,而是存储它是否为NULL的标记占用1个字节),而空字符串’'是不占用磁盘空间的(它的长度是0字节所以不占用)。

网上找到的相关资料显示NULL是占用磁盘空间的

官方文档说明“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
翻译:NULL列需要行中的额外空间来记录它们的值是否为NULL。

即:定义字段类型时,如果允许为NULL,那么就要为每条数据多分配一个字节的空间来表示字段是否为NULL。

直接在mysql中验证即可:

2、字段类型是varchar时可以默认为空字符串,字段类型是int时不可以默认为空字符串,可以设置为0。

3、当字段被设置为not null时,字段就不能是NULL但可以插入空字符串,但空字符串只能插入到字符串类型的字段中,插入其他类型的字段中会报错。而NULL可插入到任何允许为NULL的字段中。

4、SQL语句中对空字符串进行判断时可以使用=、>、<符号;但是对NULL进行判断时必须使用is null或is not null。

5、包含NULL的字段列,如果在查询条件中使用is not null会导致索引失效,但是使用is null索引不会失效。

6、使用count()函数进行统计时,会过滤掉NULL值,但不会过滤掉空字符串。
————————————————
版权声明:本文为CSDN博主「韩某Hyman」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35383263/article/details/81281961

你可能感兴趣的:(MySQL默认值NULL、空值、Empty String的区别,如何选择?)