MySQL null的一些易错点

 更新时间:2020年12月23日 09:57:13   作者:OMOZ   
这篇文章主要介绍了MySQL null的一些易错点,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下

依据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的资料请关注脚本之家其它相关文章!

相关文章

  • mysql数据库锁的产生原因及解决办法

    mysql数据库锁的产生原因及解决办法

    这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下
    2016-01-01
  • mysql存数组的实例代码和方法

    mysql存数组的实例代码和方法

    在本文中我们给大家整理了关于mysql存数组的实例代码和方法以及相关知识点,有需要的朋友们跟着学习下。
    2019-05-05
  • MySQL如何让一个表中可以有多个自增列

    MySQL如何让一个表中可以有多个自增列

    这篇文章主要介绍了MySQL如何让一个表中可以有多个自增列,自增列可使用 auto_increment 来实现,当一个列被标识为 auto_increment 之后,在添加时如果不给此列设置任何值,或给此列设置 NULL 值时,那么它会使用自增的规则来填充此列
    2022-06-06
  • 在MySQL中使用mysqlbinlog flashback的简单教程

    在MySQL中使用mysqlbinlog flashback的简单教程

    这篇文章主要介绍了在MySQL中使用mysqlbinlog flashback的简单教程,可以很方便地恢复数据,作者还列出了使用时一些需要注意的地方,需要的朋友可以参考下
    2015-05-05
  • 浅谈mysql 系统用户最大文件打开数限制

    浅谈mysql 系统用户最大文件打开数限制

    这篇文章主要介绍了mysql 系统用户最大文件打开数限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • MySQL 自定义变量的概念及特点

    MySQL 自定义变量的概念及特点

    MySQL 是可以自定义临时变量的,而临时变量在做查询优化和静态查询分析时十分有用。而实际上很少有人记得 MySQL 的自定义变量。本篇文章讲述 MySQL 的自定义变量的概念及特点。
    2021-05-05
  • MySQL 存储过程的优缺点分析

    MySQL 存储过程的优缺点分析

    存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。本文将分析存储过程的优缺点
    2021-05-05
  • 查看连接mysql的IP地址的实例方法

    查看连接mysql的IP地址的实例方法

    在本篇文章里小编给大家分享的是一篇关于查看连接mysql的IP地址的实例方法,有需要的朋友们可以参考下。
    2020-10-10
  • 超详细MySQL8.0.22安装及配置教程

    超详细MySQL8.0.22安装及配置教程

    这篇文章主要介绍了超详细MySQL8.0.22安装及配置教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 如何彻底删除mysql服务(清理注册表)详解

    如何彻底删除mysql服务(清理注册表)详解

    这篇文章主要给大家介绍了关于如何彻底删除mysql服务(清理注册表)的相关资料,文中通过图文介绍的非常详细,对大家的学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03

最新评论