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

 更新时间:2022年08月29日 16:47:50   作者:爱学习的李冬虎  
这篇文章主要介绍了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 运算符。

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

之前写代码的人是这样操作的

					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即可,不要管我)

					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()函数进行处理。

例如,

select ifnull(comment, '') from orange where id=100;

如果comment字段为null,就返回空字符串。

字段定义为not null,查询的时候也可能返回null

另外,对于字段定义为not null,查询的时候也可能返回null。

例如,

当记录不存在时,查询结果为空:

> select   cluster_name   from  orange      where hostname='123';
Empty set (0.00 sec)

对于查询结果为空,如果使用max()函数,返回值不再是空,字符值为null。

>select       max(cluster_name)     from  orange     where name='123';
+-------------------+
| max(cluster_name) |
+-------------------+
| NULL              |
+-------------------+
1 row in set (0.00 sec)

建议

尽量不要用null作为默认值。null作为默认值的字段,如果作为索引,会影响效率。

如果确认该字段不会用作索引,也不怕影响效率,可以直接忽略上面一条。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • MySQL中如何重建表

    MySQL中如何重建表

    这篇文章主要介绍了MySQL中如何重建表问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • mysql如何配置secure_file_priv

    mysql如何配置secure_file_priv

    这篇文章主要介绍了mysql如何配置secure_file_priv问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • MySQL中ifnull和isnull的用法及其平替方法

    MySQL中ifnull和isnull的用法及其平替方法

    ifnull和isnull都是MySQL的函数,用于对NULL值进行处理,本文就来介绍MySQL中ifnull和isnull的用法及其平替方法,感兴趣的可以了解一下
    2023-12-12
  • MySQL制作具有千万条测试数据的测试库的方法

    MySQL制作具有千万条测试数据的测试库的方法

    这篇文章主要介绍了MySQL制作具有千万条测试数据的测试库的方法,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL创建表时字符串的默认值问题

    MySQL创建表时字符串的默认值问题

    这篇文章主要介绍了MySQL创建表时字符串的默认值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • MySQL查询优化之explain的深入解析

    MySQL查询优化之explain的深入解析

    本篇文章是对MySQL查询优化中的explain进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL中的排序规则

    MySQL中的排序规则

    这篇文章主要介绍了MySQL中的排序规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • MySQL的主从复制步骤详解及常见错误解决方法

    MySQL的主从复制步骤详解及常见错误解决方法

    这篇文章主要介绍了MySQL的主从复制步骤详解及常见错误解决方法,文中主张同步时跳过临时错误,并对Slave_IO_Running: No错误的解决给出了方案,需要的朋友可以参考下
    2016-02-02
  • 详解MySQL日期 字符串 时间戳互转

    详解MySQL日期 字符串 时间戳互转

    本篇文章主要介绍了详解MySQL日期 字符串 时间戳互转,详解date转字符串、date转时间戳、字符串转date、字符串转时间戳、时间戳转date,时间戳转字符串,有兴趣的可以了解一下。
    2017-01-01
  • windows10更换mysql8.0.17详细教程

    windows10更换mysql8.0.17详细教程

    这篇文章主要为大家介绍了windows10更换mysql8.0.17的详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08

最新评论