mysql npe问题_MySQL为Null会导致5个问题,个个致命!

951f8a1998de2ac45d7ea64a17a39d9a.png

本文转载自微信公众号「Java中文社群」,作者磊哥。转载本文请联系Java中文社群公众号。

正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如下图所示:

86ded1dd7d389184c1f3829dc04c201f.png

“兵马未动粮草先行”,看完了相关的配置之后,我们先来创建一张测试表和一些测试数据。

-- 如果存在 person 表先删除

DROPTABLEIF EXISTS person;

-- 创建 person 表,其中 username 字段可为空,并为其设置普通索引

CREATETABLEperson (

id INTPRIMARYKEYauto_increment,

nameVARCHAR(20),

mobile VARCHAR(13),

index(name)

) ENGINE='innodb';

-- person 表添加测试数据

insertintoperson(name,mobile)values('Java','13333333330'),

('MySQL','13333333331'),

('Redis','13333333332'),

('Kafka','13333333333'),

('Spring','13333333334'),

('MyBatis','13333333335'),

('RabbitMQ','13333333336'),

('Golang','13333333337'),

('C++','13333333338'),

(NULL,'13333333339');

select*fromperson;

构建的测试数据,如下图所示:

860eedbe27f05577ebbbafd8fe436ae9.png

有了数据之后,我们就来看当列中存在 NULL 值时,究竟会导致哪些问题?

1.count 数据丢失

当某列存在 NULL 值时,再使用 count 查询该列,就会出现数据“丢失”问题,如下 SQL 所示:

selectcount(*),count(name)fromperson;

查询执行结果如下:

9b05d057cdf3d4d747f21535534bc443.png

从上述结果可以看出,当使用的是 count(name) 查询时,就丢失了两条值为 NULL 的数据丢失。

解决方案

如果某列存在 NULL 值时,就是用 count(*) 进行数据统计。

扩展知识:不要使用 count(常量)

阿里巴巴《Java开发手册》强制规定:不要使用 count(列名) 或 count(常量) 来替代 count(),count() 是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。

说明:count(*) 会统计值为 NULL 的行,而 count(列名) 不会统计此列为 NULL 值的行。

2.distinct 数据丢失

当使用 count(distinct col1, col2) 查询时,如果其中一列为 NULL,那么即使另一列有不同的值,那么查询的结果也会将数据丢失,如下 SQL 所示:

selectcount(distinctname,mobile)fromperson;

查询执行结果如下:

4baff8bddaabe5b6794cf3e0783f803f.png

数据库的原始数据如下:

52b59ba223d2aa6723ad423aa68febd7.png

从上述结果可以看出手机号一列的 10 条数据都是不同的,但查询的结果却为 8。

3.select 数据丢失

如果某列存在 NULL 值时,如果执行非等于查询(<>/!=)会导致为 NULL 值的结果丢失。比如以下这个数据:

ee30c864ad6892d8c3ad5a943826ac6b.png

我需要查询除 name 等于“Java”以外的所有数据,预期返回的结果是 id 从 2 到 10 的数据,但当执行以下查询时:

select*frompersonwherename<>'Java'orderbyid;

-- 或

select*frompersonwherename!='Java'orderbyid;

查询结果均为以下内容:

96d76e5c440d8086d3429abe5b498856.png

可以看出为 NULL 的两条数据凭空消失了,这个结果并不符合我们的正常预期。

解决方案

要解决以上的问题,只需要在查询结果中拼加上为 NULL 值的结果即可,执行 SQL 如下:

select*frompersonwherename<>'Java'orisnull(name)orderbyid;

最终的执行结果如下:

caee42a227ba8929fce8cb61edcbce66.png

4.导致空指针异常

如果某列存在 NULL 值时,可能会导致 sum(column) 的返回结果为 NULL 而非 0,如果 sum 查询的结果为 NULL 就可以能会导致程序执行时空指针异常(NPE),我们来演示一下这个问题。

首先,我们先构建一张表和一些测试数据:

-- 如果存在 goods 表先删除

DROPTABLEIF EXISTS goods;

-- 创建 goods 表

CREATETABLEgoods (

id INTPRIMARYKEYauto_increment,

num int

) ENGINE='innodb';

-- goods 表添加测试数据

insertintogoods(num)values(3),(6),(6),(NULL);

select*fromgoods;

表中原始数据如下:

53b6da6b9a430c5be0b6b70a6c14dda7.png

接下来我们使用 sum 查询,执行以下 SQL:

selectsum(num)fromgoodswhereid>4;

查询执行结果如下:

78e1ad710a363d3b0d94c983530db841.png

当查询的结果为 NULL 而非 0 时,就可以能导致空指针异常。

解决空指针异常

可以使用以下方式来避免空指针异常:

selectifnull(sum(num), 0)fromgoodswhereid>4;

查询执行结果如下:

62e4dd79ce845e976c97eb3ce7c183ca.png

5.增加了查询难度

当某列值中有 NULL 值时,在进行 NULL 值或者非 NULL 值的查询难度就增加了。

所谓的查询难度增加指的是当进行 NULL 值查询时,必须使用 NULL 值匹配的查询方法,比如 IS NULL 或者 IS NOT NULL 又或者是 IFNULL(cloumn) 这样的表达式进行查询,而传统的 =、!=、<>... 等这些表达式就不能使用了,这就增加了查询的难度,尤其是对小白程序员来说,接下来我们来演示一下这些问题。

还是以 person 表为例,它的原始数据如下:

516a86d198787696e945caef36f21c70.png

错误用法 1:

select*frompersonwherename<>null;

执行结果为空,并没有查询到任何数据,如下图所示:

2eeb99d6913adf4705f4adfd0c72b5e0.png

错误用法 2:

select*frompersonwherename!=null;

执行结果也为空,没有查询到任何数据,如下图所示:

8e5a5e03b3b503f5f8c2906f7049451d.png

正确用法 1:

select*frompersonwherenameisnotnull;

执行结果如下:

a70345911873059f055584f55b0d7c2d.png

正确用法 2:

select*frompersonwhere!isnull(name);

执行结果如下:

e8541a33091167d95985d4258aa04307.png

推荐用法

阿里巴巴《Java开发手册》推荐我们使用 ISNULL(cloumn) 来判断 NULL 值,原因是在 SQL 语句中,如果在 null 前换行,影响可读性;而 ISNULL(column) 是一个整体,简洁易懂。从性能数据上分析 ISNULL(column) 执行效率也更快一些。

扩展知识:NULL 不会影响索引

细心的朋友可能发现了,我在创建 person 表的 name 字段时,为其创建了一个普通索引,如下图所示:

2f348faf2ea0438e68a9b5e6cf0cd530.png

然后我们用 explain 来分析查询计划,看当 name 中有 NULL 值时是否会影响索引的选择。

explain 的执行结果如下图所示:

66fbc50c80eabe2c1b5261d5c9d101a5.png

从上述结果可以看出,即使 name 中有 NULL 值也不会影响 MySQL 使用索引进行查询。

总结

本文我们讲了当某列为 NULL 时可能会导致的 5 种问题:丢失查询结果、导致空指针异常和增加了查询的难度。因此在最后提倡大家在创建表的时候尽量设置 is not null 的约束,如果某列确实没有值,可以设置空值('')或 0 作为其默认值。

【编辑推荐】

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构导论(一)

导读&#xff1a;在看书前&#xff0c;我对这本书的内容&#xff0c;是 这么想的&#xff1a;数据结构&#xff0c;那大概就是关于数据和结构的东西。而讲到数据&#xff0c;估计会说到数据类型&#xff0c;数据定义&#xff0c;数据存储等方面。然后在结构方面&#xff0c;就不…

基于java的汽车维修保养智能预约系统论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

mysql 日志同步 数据不同步_Mysql互为主从问题--日志同步数据不同步

Mysql互为主从问题--日志同步数据不同步我搭建的是mysql互为主从 复制两台机器的mysql环境完全相同第一部分测试&#xff1a;B为master A为slave的同步测试在B上创建表lian&#xff0c;并插入数据mysql> create table lian (a int,b char(10));mysql> insert into lian (…

UVALive 4764 dp

DES: 这是一个新的游戏。给你一套牌、编号从1到100000.正常来说。你手中的牌和这次翻的牌是一样的&#xff0c;就会加一分。但是。如果是999的话。加三分。所以问你最大的分是多少。 貌似是简单的DP吧。&#xff08;DP菜鸟...再简单我也不会...T_T...&#xff09;于是...我看懂…

mysql数据库事务命令_MySql学习18----数据库事务---命令使用(02)

本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作。下一篇会讲述如何使用JDBC进行数据库的事务操作。事务是指数据库中的一组逻辑操作&#xff0c;这个操作的特点就是在该组逻辑中&#xff0c;所有的操作要么全部成功&#xff0c;要么全部失…

sequelize连接mysql_Sequelize没有连接mysql

文件config / config.json{"development": {"username": "root","password": null,"database": "example","host": "example.sqlite","dialect": "sqlite"},"stage…

SQL SERVER 2014 各个版本支持的功能

转自&#xff1a;https://technet.microsoft.com/library/cc645993 转换箱规模限制 功能名称EnterpriseBusiness IntelligenceStandardWebExpress with Advanced ServicesExpress with ToolsExpress单个实例使用的最大计算能力&#xff08;SQL Server 数据库引擎&#xff09;1操…

Android无法生成R文件的终极解决办法

R文件如果在clean项目&#xff08;Project—>Clean&#xff09;和 Fix Project Properties&#xff08;如下图&#xff09;&#xff1a; 如果在第一步无法解决的的时候&#xff0c;那可能原因就是资源文件调用的错误&#xff0c;比如资源文件命名不规范&#xff0c;多余的资…

java awt 教程_JAVA教程 第五讲 AWT图形用户界面设计

5.1 用AWT生成图形化用户界面抽象窗口工具包AWT (Abstract Window Toolkit) 是 API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface)工具集&#xff0c;AWT可用于Java的applet和applications中。它支持图形用户界面编程的功能包括&#xff1a; 用户界面组件&am…

从C# String类理解Unicode(UTF8/UTF16)

上一篇博客&#xff1a;从字节理解Unicode&#xff08;UTF8/UTF16)。这次我将从C# code 中再一次阐述上篇博客的内容。 C# 代码看UTF8 代码如下&#xff1a; string test "UTF-8你"; //把字符转换为 byte[] byte[] bytearray_UTF8 Encoding.UTF8.GetBytes(test)…

python浅拷贝深拷贝

copy_listlist[:] 得到的是浅拷贝&#xff0c;即只能顶层拷贝&#xff0c;里面的嵌套不会复制一份。 a [0, [1, 2], 3] b a[:] a[0] 8 a[1][1] 9 请问现在a和b分别是多少&#xff1f; 答案&#xff1a;是 a 为 [8, [1, 9], 3]&#xff0c;b 为 [0, [1, 9], 3]。 b的第二个…

中兴的一道笔试题

今天做了中兴的秋招题目&#xff0c;有一个题以前没有仔细想过&#xff0c;题目我有点儿记不清楚了&#xff0c;大概意思是这样的&#xff1a;有一个循环的单链表&#xff0c;给定该链表的尾指针比给定头指针好么&#xff1f; 我的思路&#xff1a;如下图&#xff0c;这是一个循…

Android SurfaceView实现静态于动态画图效果

本文是基于Android的SurfaceView的动态画图效果&#xff0c;实现静态和动态下的正弦波画图&#xff0c;可作为自己做图的简单参考&#xff0c;废话不多说&#xff0c;先上图&#xff0c; 静态效果&#xff1a; 动态效果&#xff1a; 比较简单&#xff0c;代码注释的也比较详细&…

数学概念——J - 数论,质因数分解

J - 数论&#xff0c;质因数分解Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit StatusDescription Tomorrow is contest day, Are you all ready? We have been training for 45 days, and all guys must be tired.But , you are…

java黄金分割点游戏_结对编程1——黄金点小游戏项目简介及需求分析

一、项目成员2018141461085龚泽楠2018141461012蔡铧荣二、项目名称黄金点小游戏三、项目简介游戏规则&#xff1a; N个同学( N通常大于 10 )&#xff0c;每人写一个 0~100 之间的有理数 (不包括 0或100) &#xff0c;交给裁判算出所有数字的平均值然后乘以 0.618 (所谓黄金分割…

HDU 2242 考研路茫茫——空调教室

考研路茫茫——空调教室 Time Limit: 2000msMemory Limit: 32768KBThis problem will be judged on HDU. Original ID: 224264-bit integer IO format: %I64d Java class name: Main众所周知&#xff0c;HDU的考研教室是没有空调的&#xff0c;于是就苦了不少不去图书馆的…

java 正则表达式 组合_java基础:5.1 面向对象、类的关联 聚合 组合、正则表达式...

上一个礼拜太忙了&#xff0c;今天开始恢复java的学习~目录1、面向过程——面向对象的区别传统的面向过程式编程是动作驱动的&#xff0c;数据和动作是分离的。面向对象编程的范式重点在于对象&#xff0c;动作和数据一起定义在对象中。面向过程的范式重点在于设计方法。面向对…

html5学习之路_003

html布局 使用<div>元素布局使用<table>元素布局<div>元素布局 <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>div布局</title><link rel"stylesheet" type&qu…

变量不合法的表达式JAVA_Java8中lambda表达式的语法,别人都会的,你还不会吗?「一」...

函数式编程函数式编程是一种编程方式&#xff0c;它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus)&#xff0c;λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 函数式编程是"结构化编程"的一种&#xff0c;主要思想是把运…

动手制作属于你自己的WIN PE3.0

最近想要更新公司的网Ghost系统&#xff0c;所以小研究一下win pe &#xff0c;在网上看见一个很不错的教程&#xff0c;在这里分享给大家&#xff01;并非原创&#xff0c;纯属转载&#xff01;&#xff01;O(∩_∩)O~天缘的作品&#xff0c;很是佩服这个哥们啊.....一、WINPE…