博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL中处理Null时要注意两大陷阱
阅读量:7212 次
发布时间:2019-06-29

本文共 1637 字,大约阅读时间需要 5 分钟。

摘要:作为MySQL数据库管理员,我们经常要与Null做斗争。但是在这其中,你需要注意一下两大陷阱。

  MySQL数据库是一个基于结构化数据的开源数据库。SQL语句是MySQL数据库中核心语言。不过在MySQL数据库中执行SQL语句,需要小心两个陷阱。

  陷阱一:空值不一定为空

  空值是一个比较特殊的字段。在MySQL数据库中,在不同的情形下,空值往往代表不同的含义。这是MySQL数据库的一种特性。如在普通的字段中(字符型的数据),空值就是表示空值。但是如果将一个空值的数据插入到TimesTamp类型的字段中,空值就不一定为空。此时为出现什么情况呢(如下图)?

MySQL中处理空值时要小心两个个陷阱

  我先创建了一个表。在这个表中有两个字段:User_id(其数据类型是int)、Date(其数据类型是TimesTamp)。现在往这个表中插入一条记录,其中往Date字段中插入的是一个NULL空值。可是当我们查询时,其结果显示的却是插入记录的当前时间。这是怎么一回事呢?其实这就是在MySQL数据库中执行SQL语句时经常会遇到的一个陷阱:空值不一定为空。在操作时,明明插入的是一个空值的数据,但是最后查询得到的却不是一个空值。

  在MySQL数据库中,NULL对于一些特殊类型的列来说,其代表了一种特殊的含义,而不仅仅是一个空值。对于这些特殊类型的列,各位读者主要是要记住两个。一个就是笔者上面举的TimesTamp数据类型。如果往这个数据类型的列中插入Null值,则其代表的就是系统的当前时间。另外一个是具有auto_increment属性的列。如果往这属性的列中插入Null值的话,则系统会插入一个正整数序列。而如果在其他数据类型中,如字符型数据的列中插入Null的数据,则其插入的就是一个空值。

  陷阱二:空值不一定等于空字符

  在MySQL中,空值(Null)与空字符(’’)相同吗?答案是否定的。请大家先来看下图的演示。

MySQL中处理空值时要小心两个个陷阱

  在同一个数据库表中,同时插入一个Null值的数据和一个’’空字符的数据,然后利用Select语句进行查询。最后显示的结果如上图所示。显然其显示的结果是不相同的。从这个结果中就可以看出,空值不等于空字符。这就是在MySQL中执行SQL语句遇到的第二个陷阱。在实际工作中,空值数据与空字符往往表示不同的含义。数据库管理员可以根据实际的需要来进行选择。

  如对于电话号码等字段,可以默认设置为空值(表示根本不知道对方的电话号码)或者设置为空字符(表示后来取消了这个号码)等等。由于他们在数据库中会有不同的表现形式,所以数据库管理员需要区别对待。笔者更加喜欢使用空值,而不是空字符。这主要是因为针对空值这个数据类型有几个比较特殊的运算字符。如果某个字段是空字符,数据库中是利用字段名称来代替。相反,如果插入的是空值,则直接显示的是NULL。这跟其他数据库的显示方式也是不同的。

  一是IS NULL 和IS NOT NULL关键字。如果要判断某个字段是否含用空值的数据,需要使用特殊的关键字。其中前者表示这个字段为空,后者表示这个字段为非空。在Select语句的查询条件中这两个关键字非常的有用。如需要查询所有电话号码为空的用户(需要他们补充电话号码信息),就可以在查询条件中加入is not null关键字。

MySQL中处理空值时要小心两个个陷阱

  二是Count等统计函数,在空值上也有特殊的应用。如现在需要统计用户信息表中有电话号码的用户数量,此时就可以使用count函数、同时将电话号码作为参数来使用。因为在统计过程中,这个函数会自动忽略空值的数据。此时统计出来的就是有电话号码的用户信息。如果采用的是空字符的数据,则这个函数会将其统计进去。如下图所示,统计刚才建立的两条记录时,系统统计的结果是1,而不是2。可见系统自动将Null值的数据忽略掉了。

转载于:https://www.cnblogs.com/ljianhui/archive/2012/09/02/2695898.html

你可能感兴趣的文章
SpringCloudSpringBootmybatis分布式微服务云架构-hystrix参数详解
查看>>
(一)spring cloud微服务分布式云架构-Spring Cloud简介
查看>>
百家笔记网为什么选择采用读书笔记为博客写作主题?
查看>>
如果需要精确的答案,请避免使用float 和 double(48)
查看>>
假如高考考python编程,这些题目你会几个呢?
查看>>
计算机网络学习整理:Http协议
查看>>
单用户模式和救援模式
查看>>
ActiveMQ从入门到精通(一)
查看>>
时序数据库连载系列:指标届的独角兽Prometheus
查看>>
Vue slot的用法
查看>>
VS的Release模式下进行调试的VS修改和cmake修改
查看>>
利用NEO与Unity制作游戏(第2部分)
查看>>
microSD推新卡Express传输速度可达985MBps
查看>>
Java B2B2C多用户商城 springboot架构 (五)springboot整合 beatlsql
查看>>
面向对象
查看>>
linux:ubuntu安装mysql
查看>>
提升搬砖效率的神兵利器
查看>>
《Think in Java》读书笔记
查看>>
Ubuntu下安装samba
查看>>
iOS核心动画笔记4-图形几何学
查看>>