mysql中的null字段值的处理及大小写问题

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 在MySQL中,NULL字段的处理,需要注意,当在处理查询条件中有NULL,很有可能你得到的值不是想要的,因为,在MySQL中,判断NULL值相等(=)或者不等(!=)都会返回false。主要出现在常见的SELECT以及WHERE字句中。

在MySQL中,NULL字段的处理,需要注意,当在处理查询条件中有NULL,很有可能你得到的值不是想要的,因为,在MySQL中,判断NULL值相等(=)或者不等(!=)都会返回false。主要出现在常见的SELECT以及WHERE字句中。

为了处理这种特殊的情况,MySQL提供了如下的关键字进行特殊处理:

  • IS NULL: 当列的值是NULL,此运算符返回true。
  • IS NOT NULL: 当列的值不为NULL, 运算符返回true。
  • <=>: 比较操作符(不同于=运算符),当比较的的两个值为NULL时返回true。

关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在MySQL中,NULL值与任何其它值的比较(即使是NULL)永远返回false,即 NULL = NULL 返回false 。

 

下面看看例子,就很清楚的理解是什么意思了。

先在test数据库中创建一个表checknull。

复制代码
1 mysql> use test
2 Database changed
3 mysql> show tables;
4 Empty set (0.00 sec)
5 
6 mysql> create table checknull(
7     -> name varchar(30) not null,
8     -> age int);
9 Query OK, 0 rows affected (0.11 sec)
复制代码

我们看看这个表的创建基本信息,用show和desc分别查看:

复制代码
 1 mysql> show create table checknull;
 2 +-----------+-------------------------------------------------------------------------------------------------------------------------------+
 3 | Table     | Create Table                                                                                                                  |
 4 +-----------+-------------------------------------------------------------------------------------------------------------------------------+
 5 | checknull | CREATE TABLE `checknull` (
 6   `name` varchar(30) NOT NULL,
 7   `age` int(11) DEFAULT NULL
 8 ) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
 9 +-----------+-------------------------------------------------------------------------------------------------------------------------------+
10 1 row in set (0.01 sec)
11 
12 mysql> desc checknull;
13 +-------+-------------+------+-----+---------+-------+
14 | Field | Type        | Null | Key | Default | Extra |
15 +-------+-------------+------+-----+---------+-------+
16 | name  | varchar(30) | NO   |     | NULL    |       |
17 | age   | int(11)     | YES  |     | NULL    |       |
18 +-------+-------------+------+-----+---------+-------+
19 2 rows in set (0.00 sec)
复制代码

 

我们开始测试一下,第一步,向这个表中插入数据:

复制代码
 1 mysql> insert checknull (name, age) values("water", 30);
 2 Query OK, 1 row affected (0.00 sec)
 3 
 4 mysql> 
 5 mysql> insert checknull (name, age) values("shihuc", NULL);
 6 Query OK, 1 row affected (0.00 sec)
 7 
 8 mysql> 
 9 mysql> select * from checknull;
10 +--------+------+
11 | name   | age  |
12 +--------+------+
13 | water  |   30 |
14 | shihuc | NULL |
15 +--------+------+
16 2 rows in set (0.00 sec)
复制代码

 

接下来,再查询看看,先查询所有的age字段是NULL的用户信息:

复制代码
 1 mysql> select * from checknull where age = NULL;
 2 Empty set (0.00 sec)
 3 
 4 mysql> select * from checknull where age IS NULL;
 5 +--------+------+
 6 | name   | age  |
 7 +--------+------+
 8 | shihuc | NULL |
 9 +--------+------+
10 1 row in set (0.00 sec)
复制代码
复制代码
 1 mysql> select * from checknull where age != NULL;
 2 Empty set (0.00 sec)
 3 
 4 mysql> select * from checknull where age IS NOT NULL;
 5 +-------+------+
 6 | name  | age  |
 7 +-------+------+
 8 | water |   30 |
 9 +-------+------+
10 1 row in set (0.00 sec)
复制代码

 

是不是发现,结果不同?那么我现在,通过修改大小写来查看查询结果:

复制代码
 1 mysql> select * from checknull where age IS null;
 2 +--------+------+
 3 | name   | age  |
 4 +--------+------+
 5 | shihuc | NULL |
 6 +--------+------+
 7 1 row in set (0.00 sec)
 8 
 9 mysql> select * from checknull where age = null;
10 Empty set (0.00 sec)
复制代码
复制代码
 1 mysql> select * from checknull where age != null;
 2 Empty set (0.00 sec)
 3 
 4 mysql> select * from checknull where age is not null;
 5 +-------+------+
 6 | name  | age  |
 7 +-------+------+
 8 | water |   30 |
 9 +-------+------+
10 1 row in set (0.00 sec)
复制代码

发现结果和上面的日志反映的内容一样。

 

这里补充一个小tips,那就是在Linux下,mysql默认情况下,数据库的名字,表的名字和字段的名字是区分大小写的,但是字段的值是不区分大小写的

表的名字和字段的名字是否区分大小写,可以查看数据库变量lower_case_table_names的值,0表示区分大小写;1表示不区分,统一按照小写对待。

复制代码
1 mysql> show variables like "%case%";
2 +------------------------+-------+
3 | Variable_name          | Value |
4 +------------------------+-------+
5 | lower_case_file_system | OFF   |
6 | lower_case_table_names | 0     |
7 +------------------------+-------+
8 2 rows in set (0.00 sec)
复制代码

 

而对于字段的值,想要区分大小写,可以使用BINARY加以限制。不管是在创建表的时候,还是在查询的条件字句中都可以使用。

复制代码
 1 mysql> create table lowupper(
 2     -> name varchar(30) not null,
 3     -> age int,
 4     -> home varchar(40) binary);
 5 Query OK, 0 rows affected (0.10 sec)
 6 
 7 mysql> show create table lowupper;
 8 +----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 9 | Table    | Create Table                                                                                                                                                                                            |
10 +----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
11 | lowupper | CREATE TABLE `lowupper` (
12   `name` varchar(30) NOT NULL,
13   `age` int(11) DEFAULT NULL,
14   `home` varchar(40) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
15 ) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
16 +----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
17 1 row in set (0.00 sec)
复制代码

上面日志中,可以看到,创建表的时候,

在home字段后面加了约束binary,通过show可以看到,home字段有一个校对规则 latin1_bin
说明,这个会在插入/查询数据的时候是区分大小写的。

 

下面插入数据做些验证:

复制代码
 1 mysql> insert lowupper (name, age, home) values ("shihuc", 30, "Beijing, china");
 2 Query OK, 1 row affected (0.00 sec)
 3 
 4 mysql> 
 5 mysql> insert lowupper (name, age, home) values ("water", 33, "BEIJING, china");
 6 Query OK, 1 row affected (0.00 sec)
 7 
 8 mysql> insert lowupper (name, age, home) values ("xiaocheng", 33, "hubei");
 9 Query OK, 1 row affected (0.00 sec)
10 
11 mysql> insert lowupper (name, age, home) values ("zhangsan", null, "china");
12 Query OK, 1 row affected (0.00 sec)
13 
14 mysql> insert lowupper (name, age, home) values ("lisi", null, "CHINA");
15 Query OK, 1 row affected (0.00 sec)
16 
17 mysql> insert lowupper (name, age, home) values ("wangwu", null, "China");
18 Query OK, 1 row affected (0.00 sec)
19 
20 mysql> select * from lowupper;
21 +-----------+------+----------------+
22 | name      | age  | home           |
23 +-----------+------+----------------+
24 | shihuc    |   30 | Beijing, china |
25 | water     |   33 | BEIJING, china |
26 | xiaocheng |   33 | hubei          |
27 | zhangsan  | NULL | china          |
28 | lisi      | NULL | CHINA          |
29 | wangwu    | NULL | China          |
30 +-----------+------+----------------+
31 6 rows in set (0.00 sec)
复制代码

下面,再查询一下看看,是否有区分:

复制代码
1 mysql> select * from lowupper where home = "china";
2 +----------+------+-------+
3 | name     | age  | home  |
4 +----------+------+-------+
5 | zhangsan | NULL | china |
6 +----------+------+-------+
7 1 row in set (0.00 sec)
复制代码

 

再操作上面checknull表,在其中插入一条新的数据,进行查询,看是否区分大小写:

复制代码
 1 mysql> insert checknull (name, age) values ("SHIHUC", null);
 2 Query OK, 1 row affected (0.00 sec)
 3 
 4 mysql> select * from checknull;
 5 +--------+------+
 6 | name   | age  |
 7 +--------+------+
 8 | water  |   30 |
 9 | shihuc | NULL |
10 | SHIHUC | NULL |
11 +--------+------+
12 3 rows in set (0.00 sec)
13 
14 mysql> select * from checknull where name = "shihuc";
15 +--------+------+
16 | name   | age  |
17 +--------+------+
18 | shihuc | NULL |
19 | SHIHUC | NULL |
20 +--------+------+
21 2 rows in set (0.00 sec)
22 
23 mysql> select * from checknull where binary name = "shihuc";
24 +--------+------+
25 | name   | age  |
26 +--------+------+
27 | shihuc | NULL |
28 +--------+------+
29 1 row in set (0.00 sec)
复制代码

 

是不是很显然的,说明MySQL的大小写问题,还是很有意思的,需要注意,在linux环境下。windows环境下,没有测试,不是很确定。有经验的可以分享一下!

http://www.cnblogs.com/shihuc/p/5165169.html

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
26天前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 IS NULL
【8月更文挑战第12天】
569 0
在 MySQL 中使用 IS NULL
|
29天前
|
存储 关系型数据库 MySQL
"Linux环境下MySQL数据库名及表名大小写敏感性设置详解:从配置到影响,确保数据库操作的准确与高效"
【8月更文挑战第9天】在Linux环境中,MySQL数据库名及表名的大小写敏感性是一项重要配置。默认情况下,MySQL在Linux上区分大小写,但这可通过配置文件 `/etc/my.cnf` 中的 `lower_case_table_names` 参数调整。该参数设为0时,名称存储时保持原样,查询时不区分大小写;设为1则全部转换为小写。通过编辑配置文件并重启MySQL服务,可根据需求灵活控制名称的大小写敏感性,确保数据一致性和应用兼容性。
47 3
|
2月前
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
40 7
|
17天前
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
30 0
|
2月前
|
存储 SQL 缓存
MySQL设计规约问题之为什么要将大字段、访问频率低的字段拆分到单独的表中存储
MySQL设计规约问题之为什么要将大字段、访问频率低的字段拆分到单独的表中存储
|
2月前
|
SQL 存储 索引
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
|
16天前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
69 2
|
11天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
15天前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
12天前
|
人工智能 小程序 关系型数据库
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略
本文以热门游戏《黑神话:悟空》为契机,深入浅出地解析了数据库事务的四种隔离级别:读未提交、读已提交、可重复读和串行化。通过具体示例,展示了不同隔离级别下的事务行为差异及可能遇到的问题,如脏读、不可重复读和幻读等。此外,还介绍了在MySQL中设置隔离级别的方法,包括全局和会话级别的调整,并通过实操演示了各隔离级别下的具体效果。本文旨在帮助开发者更好地理解和运用事务隔离级别,以提升数据库应用的一致性和性能。
77 2
【MySQL】黑悟空都掌握的技能,数据库隔离级别全攻略

热门文章

最新文章

下一篇
DDNS