当前位置: 首页 > 科技观察

记得在MySQL中使用notnull,不然滚蛋!

时间:2023-03-23 10:06:25 科技观察

图片来自抱图网。真是外行看热闹,内行看门道。这是一个程序员可以Get的笑话,说明程序没有正确从数据库中获取我的名字,然后将空值格式化为null。好像看到了程序员小姐姐被喷的场景。那是一个温暖的下午,明媚的阳光洒在办公桌上。小姐姐正在敲代码,突然……“啪啪啪!!哈哥别睡了,老板让你去开会!”我c...言归正传,造成这种情况的原因一般是数据库的数据问题导致的。我大胆猜了几个场景,同学们可以在评论区补充:①第一次将名字存入数据库时??,我的名字填写失败,出现错误。MySQL默认为null值,并在查询时格式化为'null'字符串。②我在注册的时候故意在名字中加入了\n、\r等不雅数据,导致查询时返回空字符串'',而在正则校验时出现空指针。③我把id设置为'null'(别了,兄弟们,我还能这么无聊吗?~~)在MySQL中,NULL表示未知数据。我们在设计表的时候,老司机经常会告诉我们:字段满了可以用NOTNULL代替NULL,除非有特殊情况!但是他们只给出结论不说明原因,就像喝鸡汤没有勺子一样,有点烦人,所以很多同学只知道其中一个结论,不知道第二个。说实话,老司机可能不知道为什么,可能是他老板让他这么做的~~就像我老板一样,记得刚来公司的时候,他语重心长的跟我说:MySQL表字段记得用notnull,否则滚出去!?????今天就带大家弄明白为什么我建议大家表字段尽量使用notnull!首先看MySQL官网文档中提到NULL的地方:NULL列需要行中额外的空间来记录它们的值是否为NULL。对于MyISAM表,每个NULL列多占用一位,四舍五入到最接近的字节。对于MyISAM表,每个NULL列都会花费一个额外的位,四舍五入到最接近的字节。其实这就是官方委婉的告诉你,不要用NULL就完了~~来看看NULL值有多少坑吧。这里我就结合NULL字段给大家讲解一下sum函数,count函数,以及查询条件为NULL值高时可能踩到的坑。先给我们的测试表:mysql>select*fromdemo0527;+----+------------+------+------+|id|name|money|age|+----+------------+--------+------+|1|陈哈哈1|100|NULL||2|陈哈哈2|NULL|NULL||3|NULL|100|NULL|+----+------------+--------+------+3rowsinset(0.00sec)————————————————结合数据库中表demo0527的空值来看下面三个用例:例1:通过sum函数统计一个只有NULL值的列的总和,比如SUM(age)。例2:选择记录数,count使用了一个允许NULL的字段,比如COUNT(name)。例3:使用=NULL条件查询字段值为NULL的记录,如money=null条件。以上三个例子对应的测试SQL如下:SELECTSUM(age)fromdemo0527;SELECTcount(name)fromdemo0527;SELECT*FROMdemo0527WHEREmoney=null;查询结果:mysql>SELECTSUM(age)fromdemo0527;+-----------+|SUM(age)|+--------+|NULL|+----------+1rowinset(0.00sec)mysql>SELECTcount(name)fromdemo0527;+------------+|count(名称)|+------------+|2|+-------------+1rowinset(0.00sec)mysql>SELECT*FROMdemo0527WHEREmoney=null;Emptyset(0.00sec)得到的结果,分别为NULL、2、空List;很明显,这3条SQL语句的执行结果和我们的预期是不一样的:虽然表中的ages都是NULL,但是SUM(age)的结果应该是0。虽然第三行记录的名字是NULL,但是检查的总行数应该是3。使用money=NULL没有找到id=2的记录,查询条件无效。三个例子的原因是:①当MySQL中的sum函数不统计任何记录时,会返回null而不是0。可以使用IFNULL(null,0)函数将null转换为0。②使用count(field)在MySQL中不统计空值,只有COUNT(*)可以统计所有行。③在MySQL中,使用=、<、>等算术比较运算符来比较NULL的结果总是NULL,这种比较没有任何意义。您需要使用ISNULL、ISNOTNULL或ISNULL()函数进行比较。我们根据以上原因对SQL进行相应的修改:SELECTIFNULL(SUM(age),0)FROMdemo0527;SELECTCOUNT(*)FROMdemo0527;SELECT*FROMdemo0527WHEREageISNULL;修改后,我们查询的结果就是我们想要的:mysql>SELECTIFNULL(SUM(age),0)FROMdemo0527;+--------------------+|IFNULL(SUM(age),0)|+------------------+|0|+--------------------+1rowinset(0.00sec)mysql>SELECTCOUNT(*)FROMdemo0527;+--------+|COUNT(*)|+---------+|3|+----------+1rowinset(0.00sec)mysql>SELECT*FROMdemo0527WHEREageISNULL;+----+------------+--------+------+|id|姓名|金钱|年龄|+----+------------+--------+------+|1|陈哈哈1|100|NULL||2|陈哈哈2|NULL|NULL||3|NULL|100|NULL|+----+------------+------+------+3rowsinset(0.00sec)同样值得注意的是,不仅money=NULL条件找不到字段值为NULL的记录,而且当我们使用SELECT*FROMdemo0527WHEREmoney<>100;查询id=2的行到任何数据。我们在工作中经常会在这里绊倒,从而导致统计不准确。给大家mark一下。mysql>SELECT*FROMdemo0527WHEREmoney<>100;Emptyset(0.02sec)可见MySQL库中的NULL值很容易导致我们统计查询表数据时出错。这里可能有同学会问有没有性能提升,是不是SQL优化。其实把NULL列改成NOTNULL带来的性能提升可以忽略不计。除非确定已经造成问题,否则不需要优先考虑。优化措施。作者:陈哈哈编辑:陶佳龙来源:转载自公众号MySQL江湖道(ID:mysql_chenhaha)

最新推荐
猜你喜欢