MySQL中设置NULL和空白字符串的问题及解决
MySQL设置NULL和空白字符串问题
今天在修改一个bug,发现了很多问题。
记录其中一个比较有意识的bug。
数据库使用的是MySQL
先不谈问题,我就是觉得同一个字段,有人存了设置为空白字符串,有人设置了NULL。
空值是不占用空间的,MySQL中的NULL其实是占用空间的。
还有啊,有时候你虽然插入了NULL,但在数据库中还是有值的,例如时间字段timestamp,虽然你插入了NULL,但会自动获取当前时间进行存储。
在MySQL中判断是否为NULL
为了处理这种情况,MySQL提供了三大运算符:
-
IS NULL
: 当列的值是 NULL,此运算符返回 true。 -
IS NOT NULL
: 当列的值不为 NULL, 运算符返回 true。 -
<=>
: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。
关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 NULL,即 NULL = NULL 返回 NULL 。
MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。
从数据库获取一个集合,里面存着如下内容
之前写代码的人是这样操作的
?1 2 3 4 5 6 7 8 9 10 11 12 13 | if(alarmDetailList!= null && alarmDetailList. size ()>0){ for ( int i=0;i<alarmDetailList. size ();i++){ Object[] obj = alarmDetailList.get(i); String deviceType = obj[5].toString();//设备类型 List newlist = new ArrayList(); Alarm alarm = new Alarm(); alarm.setDevicename(obj[0].toString()); alarm.setStarttime(obj[1].toString()); alarm.setEndtime(obj[2].toString()); alarm.setAlarmcontent(obj[4].toString()); alarm.setAlarmType(obj[5].toString()); result. add (alarm); } |
debug一下,很明显出了问题,在遍历时,当值为NULL时,使用toString()方法是会报空指针异常的。
加一个判断,即可(多写一个无关的条件,只判断==null即可,不要管我)
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 | if(alarmDetailList!= null && alarmDetailList. size ()>0){ for ( int i=0;i<alarmDetailList. size ();i++){ Object[] obj = alarmDetailList.get(i); String deviceType = obj[5].toString();//设备类型 List newlist = new ArrayList(); Alarm alarm = new Alarm(); alarm.setDevicename(obj[0].toString()); alarm.setStarttime(obj[1].toString()); alarm.setEndtime(obj[2].toString()); alarm.setAlarmcontent((obj[4]== null ||obj[4].equals( "" ))? "" :obj[4].toString()); alarm.setAlarmType(obj[5].toString()); result. add (alarm); } } |
前人挖坑,后人接着挖,总有人会跳进去。。
MySQL中空值(null)和空字符(‘‘)
空值(null)和空字符(‘’)是两个比较容易混淆的概念。
本文对两者的区别做简单梳理。
长度和判空
长度 | 判断空 | |
---|---|---|
空值null | 长度为null,占空间,但具体占用多大空间不确定。 | 判断null用is null或is not null |
空字符串’’ | 长度为0,不占用空间。 | 判断空字符用=‘‘或者!=’’ |
ifnull
对于空值null,可以使用ifnull()函数进行处理。
例如,
?1 | select ifnull(comment, '' ) from orange where id=100; |
如果comment字段为null,就返回空字符串。
字段定义为not null,查询的时候也可能返回null
另外,对于字段定义为not null,查询的时候也可能返回null。
例如,
当记录不存在时,查询结果为空:
?1 2 | > select cluster_name from orange where hostname= '123' ; Empty set (0.00 sec) |
对于查询结果为空,如果使用max()函数,返回值不再是空,字符值为null。
?1 2 3 4 5 6 7 | > select max (cluster_name) from orange where name = '123' ; + -------------------+ | max (cluster_name) | + -------------------+ | NULL | + -------------------+ 1 row in set (0.00 sec) |
建议
尽量不要用null作为默认值。null作为默认值的字段,如果作为索引,会影响效率。
如果确认该字段不会用作索引,也不怕影响效率,可以直接忽略上面一条。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/sdwujk160507140150/article/details/108759796
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。