MySQL null的一些易错点

依据null-values,MySQL的值为null的意思只是代表没有数据,null值和某种类型的零值是两码事,比如int类型的零值为0,字符串的零值为””,但是它们依然是有数据的,不是null.

我们在保存数据的时候,习惯性的把暂时没有的数据记为null,表示当前我们无法提供有效的信息.

不过使用null但是时候,需要我们注意一些问题.对此MySQL文档说明如下: problems-with-null

使用null的易错点

下面我摘取MySQL官方给出的null的易错点做讲解.

对MySQL不熟悉的人很容易搞混null和零值

The concept of the NULL value is a common source of confusion for newcomers to SQL

比如下面这2句SQL产生的数据是独立的

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ('');

第一句SQL只是表示暂时不知道电话号码是多少,第二句是电话号码知道并且记录为''

Both statements insert a value into the phone column, but the first inserts a NULL value and the second inserts an empty string. The meaning of the first can be regarded as “phone number is not known” and the meaning of the second can be regarded as “the person is known to have no phone, and thus no phone number.”

对null的逻辑判断要单独处理

对于是否为null的判断必须使用专门的语法IS NULL,IS NOT NULL,IFNULL().

To help with NULL handling, you can use the IS NULL and IS NOT NULL operators and the IFNULL() function.

如果你使用=判断,那么永远是false

In SQL, the NULL value is never true in comparison to any other value, even NULL

To search for column values that are NULL, you cannot use an expr = NULL test. The following statement returns no rows, because expr = NULL is never true

比如你这样写,where后判断的结果永不会是true:

SELECT * FROM my_table WHERE phone = NULL;

如果你使用null和其他数据做计算,那么结果永远是null,除非MySQL文档对某些操作做了额外的特殊说明

An expression that contains NULL always produces a NULL value unless otherwise indicated in the documentation for the operators and functions involved in the expression

例如:

mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
+------+--------+--------------------------+
| NULL | 1+NULL | CONCAT('Invisible',NULL) |
+------+--------+--------------------------+
| NULL |  NULL | NULL           |
+------+--------+--------------------------+
1 row in set (0.00 sec)

所以你要对null做逻辑判断,还是乖乖的使用IS NULL

To look for NULL values, you must use the IS NULL test

对有null值的列做索引要额外预料到隐藏的细节

只有InnoDB,MyISAM,MEMORY 存储引擎支持给带有null值的列做索引

You can add an index on a column that can have NULL values if you are using the MyISAM, InnoDB, or MEMORY storage engine. Otherwise, you must declare an indexed column NOT NULL, and you cannot insert NULL into the column.

索引的长度会比普通索引大1,也就是略微耗内存点

Due to the key storage format, the key length is one greater for a column that can be NULL than for a NOT NULL column.

对null值做分组,去重,排序会被特殊对待

和上文讲的=null永远是false相反,这时null 被认为是相等的.

When using DISTINCT, GROUP BY, or ORDER BY, all NULL values are regarded as equal.

对null排序会被特殊对待

null值要么被排在最前面,要么最后面

When using ORDER BY, NULL values are presented first, or last if you specify DESC to sort in descending order.

聚合操作时null被忽略

Aggregate (group) functions such as COUNT(), MIN(), and SUM() ignore NULL values

例如count(*)不会统计值为null的数据.

The exception to this is COUNT(*), which counts rows and not individual column values. For example, the following statement produces two counts. The first is a count of the number of rows in the table, and the second is a count of the number of non-NULL values in the age column:

mysql> SELECT COUNT(*), COUNT(age) FROM person;

以上就是MySQL null的一些易错点的详细内容,更多关于MySQL null的资料请关注我们其它相关文章!

(0)

相关推荐

  • MySQL IFNULL判空问题解决方案

    问题:mybatis返回的null类型数据消失,导致前端展示出错 思路:如果查询出的结果是空值,应当转换成空字符串.当然在前端也能进行判断,但要求后台实现这个功能. 解决方案: 使用如下方法查询: SELECT IFNULL(sex,'') AS sex FROM user --如果查询到这个sex为null值,那么就赋值成空字符串 不过,如果查询语句本身为null,那么返回前端的还是null,这个就要在代码里判断了. 比如: SELECT IFNULL(sex,'') AS sex FROM

  • MySQL中建表时可空(NULL)和非空(NOT NULL)的用法详解

    对于MySQL的一些个规范,某些公司建表规范中有一项要求是所有字段非空,意味着没有值的时候存储一个默认值.其实所有字段非空这么说应该是绝对了,应该说是尽可能非空,某些情况下不可能给出一个默认值. 那么这条要求,是基于哪些考虑因素,存储空间?相关增删查改操作的性能?亦或是其他考虑?该理论到底有没有道理或者可行性,本文就个人的理解,做一个粗浅的分析. 1,基于存储的考虑 这里对存储的分析要清楚MySQL数据行的存储格式,这里直接从这篇文章白嫖一部分结论,文章里分析的非常清楚(其实也是参考<MySQL

  • MySQL中NOT IN填坑之列为null的问题解决

    前一段时间在公司做一个小功能的时候,统计一下某种情况下有多少条数据,然后修改的问题,当时感觉很简单,写了一个如下的 SQL: SELECT COUNT(*) FROM t1 where tl.c1 not IN (SELECT t2.c1 FROM t2); 预期的结果是:有多少条数据在 t1 中,同时不在 t2 中,结果为:0,也就是 t1 中数据都在 t2 中,但是很容易就发现某些数据在 t1 中不在 t2 中,所以就感觉很奇怪,这个 SQL 看着也没问题啊.经过一番查询原来是因为 t2 的

  • MySQL中可为空的字段设置为NULL还是NOT NULL

    经常用mysql的人可能会遇到下面几种情况: 1.我字段类型是not null,为什么我可以插入空值 2.为什么not null的效率比null高 3.判断字段不为空的时候,到底要用 select * from table where column <> '' 还是要用 select * from table where column is not null 带着上面几个疑问,我们来简单的研究一下null 和 not null 到底有什么不一样,他们之间的区别是什么以及各自的效率问题. 首先,

  • MySQL Innodb 存储结构 和 存储Null值 用法详解

    背景: 表空间:INNODB 所有数据都存在表空间当中(共享表空间),要是开启innodb_file_per_table,则每张表的数据会存到单独的一个表空间内(独享表空间). 独享表空间包括:数据,索引,插入缓存,数据字典.共享表空间包括:Undo信息(不会回收<物理空间上>),双写缓存信息,事务信息等. 段(segment):组成表空间,有区组成. 区(extent):有64个连续的页组成.每个页16K,总共1M.对于大的数据段,每次最后可申请4个区. 页(page):是INNODB 磁盘

  • MySQL中NULL对索引的影响深入讲解

    前言 看了很多博客,也听过很多人说,包括我们公司的DBA,说MySql中如果某一列中含有null,那么包含该列的索引就无效了. 翻了下<高性能MySQL第二版>和<MySQL技术内幕--InnoDB存储引擎第2版>,并没有看到关于这个的介绍.但在本地试了下,null列是可以用到索引的,不管是单列索引还是联合索引,但仅限于is null,is not null是不走索引的. 后来在官方文档中找到了说明,如果某列字段中包含null,确实是可以使用索引的,地址:https://dev.m

  • MySQL null与not null和null与空值''''的区别详解

    相信很多用了MySQL很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 我字段类型是not null,为什么我可以插入空值 为毛not null的效率比null高 判断字段不为空的时候,到底要 select * from table where column <> '' 还是要用 select * from table wherecolumn is not null 呢. 带着上面几个疑问,我们来深入研究一下null 和 not null 到底有什么不一样. 首先,我们要搞清楚

  • 详解mysql不等于null和等于null的写法

    1.表结构 2.表数据 3.查询teacher_name字段不能等于空并且也不能等于空字符 SELECT * FROM sys_teacher WHERE teacher_name IS NOT NULL AND teacher_name <>'' 查询结果: 4.查询teacher_name字段等于null或等于空字符 SELECT * FROM sys_teacher WHERE teacher_name = '' OR teacher_name IS NULL 查询结果: 到此这篇关于详

  • 区分MySQL中的空值(null)和空字符('')

    日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符. 空字符('')和空值(null)表面上看都是空,其实存在一些差异: 定义: 空值(NULL)的长度是NULL,不确定占用了多少存储空间,但是占用存储空间的 空字符串('')的长度是0,是不占用空间的 通俗的讲: 空字符串('')就像是一个真空转态杯子,什么都没有. 空值(NULL)就像是一个装满空气的杯子,含有东西. 二者虽然看起来都是空的.透明的,但是有着本质的区别. 区别: 在进行count()统计

  • MySQL null的一些易错点

    依据null-values,MySQL的值为null的意思只是代表没有数据,null值和某种类型的零值是两码事,比如int类型的零值为0,字符串的零值为"",但是它们依然是有数据的,不是null. 我们在保存数据的时候,习惯性的把暂时没有的数据记为null,表示当前我们无法提供有效的信息. 不过使用null但是时候,需要我们注意一些问题.对此MySQL文档说明如下: problems-with-null 使用null的易错点 下面我摘取MySQL官方给出的null的易错点做讲解. 对M

  • JavaScript易错知识点整理

    前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点. JavaScript知识点 1.变量作用域 var a = 1; function test() { var a = 2; console.log(a); // 2 } test(); 上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2. va

  • Android悬浮窗的实现(易错点)

    0. 前言 现在很多应用都使用到悬浮窗,例如微信在视频的时候,点击Home键,视频小窗口仍然会在屏幕上显示.这个功能在很多情况下都非常有用.那么今天我们就来实现一下Android悬浮窗,以及探索一下实现悬浮窗时的易错点. 1. 实现原理 1.1 悬浮窗插入接口 在实现悬浮窗之前,我们需要知道通过什么接口,能够将一个控件放入到屏幕中去. Android的界面绘制,都是通过WindowMananger的服务来实现的.那么,既然要实现一个能够在自身应用以外的界面上的悬浮窗,我们就要利用WindowMa

  • javascript 易错知识点实例小结

    本文实例总结了javascript 易错知识点.分享给大家供大家参考,具体如下: 为什么 typeof null === 'object' 原理是这样的,不同的对象在底层都表示为二进制,在JavaScript中二进制前三位都为0的话会被判断为 object 类型, null 的二进制表示是全0,自然前三位也是0,所以执行 typeof 时会返回" object ". 对象属性的存在性 如 myObject.a 的属性访问返回值可能是 undefined ,但是这个值有可能是属性中存储的

  • Mysql NULL导致的神坑

    比较运算符中使用NULL mysql> select 1>NULL; +--------+ | 1>NULL | +--------+ | NULL | +--------+ 1 row in set (0.00 sec) mysql> select 1<NULL; +--------+ | 1<NULL | +--------+ | NULL | +--------+ 1 row in set (0.00 sec) mysql> select 1<>

  • Java 包装类型及易错陷阱详解

    目录 一.预备知识 1.1 Java内存管理 1.2 基本数据类型的包装类 1.3 包装类的构造方法 1.4 包装类的优缺点 1.5 包装类易错点 二.自动拆/装箱 三.整形池 四.优先选择基本数据类型 一.预备知识 1.Java把内存划分成两种:一种是栈内存,另一种是堆内存. 2.int是基本类型,直接存数值:而 Integer是类,产生对象时用一个引用指向这个对象. 3.包装器(wrapper)--这是<JAVA核心技术>一书中对Integer这类对象的称呼. 4.包装器位于java.la

  • MySQL NULL 值处理实例详解

    MySQL NULL 值处理 我们已经知道MySQL使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. 为了处理这种情况,MySQL提供了三大运算符: IS NULL: 当列的值是NULL,此运算符返回true. IS NOT NULL: 当列的值不为NULL, 运算符返回true. <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true. 关于 NULL 的条件比较运算是比较

  • C/C++常用函数易错点分析

    本文简单分析了C/C++中常用函数的易错点,包括memset.sizeof.getchar等函数.分享给大家供大家参考之用.具体分析如下: 1.memset #include <string.h> void* memset( void* buffer, int ch, size_t count ); 将内存中buffer的前count个字节的内容全部设置为ch指定的ASCII值.经常用来初始化数组.复制时以字节为单位,如果buffer是int long,或者其他类型的指针时,需要注意不一定为数

  • 总结js中的一些兼容性易错的问题

    一.属性相关 我们通常把特征(attribute)和属性(property)统称为属性,但是他们确实是不同的概念, 特征(attribute)会表现在HTML文本中,对特征的修改一定会表现在元素的outerHTML中,并且特征只存在于元素节点中: 属性(property)是对于JS对象进行修改,除了浏览器内置的部分特征外,其它的属性操作并不会影响HTML文本. 1. IE6/7不区分属性和特征 其它浏览器会区分属性和特征,而IE67并不会区分它们,在IE67下我们只能用属性名来删除特征,虽然这两

  • mysql存储emoji表情报错的处理方法【更改编码为utf8mb4】

    本文实例分析了mysql存储emoji表情报错的处理方法.分享给大家供大家参考,具体如下: utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符.如果直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1

随机推荐