实例:

  新建一张表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

最后修改:2024 年 08 月 04 日
如果觉得我的文章对你有用,请随意赞赏