服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL中设置NULL和空白字符串的问题及解决

MySQL中设置NULL和空白字符串的问题及解决

2022-08-30 14:11爱学习的李冬虎 Mysql

这篇文章主要介绍了MySQL中设置NULL和空白字符串的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

MySQL设置NULL和空白字符串问题

今天在修改一个bug,发现了很多问题。

记录其中一个比较有意识的bug。

数据库使用的是MySQL

先不谈问题,我就是觉得同一个字段,有人存了设置为空白字符串,有人设置了NULL。

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 运算符。

从数据库获取一个集合,里面存着如下内容

MySQL中设置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

延伸 · 阅读

精彩推荐