在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。

 mysql> use test
Database changed
mysql> show tables;
Empty set (0.00 sec) mysql> create table checknull(
-> name varchar() not null,
-> age int);
Query OK, rows affected (0.11 sec)

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

 mysql> show create table checknull;
+-----------+-------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+-------------------------------------------------------------------------------------------------------------------------------+
| checknull | CREATE TABLE `checknull` (
`name` varchar() NOT NULL,
`age` int() DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+-----------+-------------------------------------------------------------------------------------------------------------------------------+
row in set (0.01 sec) mysql> desc checknull;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name | varchar() | NO | | NULL | |
| age | int() | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
rows in set (0.00 sec)

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

 mysql> insert checknull (name, age) values("water", );
Query OK, row affected (0.00 sec) mysql>
mysql> insert checknull (name, age) values("shihuc", NULL);
Query OK, row affected (0.00 sec) mysql>
mysql> select * from checknull;
+--------+------+
| name | age |
+--------+------+
| water | |
| shihuc | NULL |
+--------+------+
rows in set (0.00 sec)

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

 mysql> select * from checknull where age = NULL;
Empty set (0.00 sec) mysql> select * from checknull where age IS NULL;
+--------+------+
| name | age |
+--------+------+
| shihuc | NULL |
+--------+------+
row in set (0.00 sec)
 mysql> select * from checknull where age != NULL;
Empty set (0.00 sec) mysql> select * from checknull where age IS NOT NULL;
+-------+------+
| name | age |
+-------+------+
| water | |
+-------+------+
row in set (0.00 sec)

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

 mysql> select * from checknull where age IS null;
+--------+------+
| name | age |
+--------+------+
| shihuc | NULL |
+--------+------+
row in set (0.00 sec) mysql> select * from checknull where age = null;
Empty set (0.00 sec)
 mysql> select * from checknull where age != null;
Empty set (0.00 sec) mysql> select * from checknull where age is not null;
+-------+------+
| name | age |
+-------+------+
| water | |
+-------+------+
row in set (0.00 sec)

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

这里补充一个小tips,那就是在Linux下,mysql默认情况下,数据库的名字,表的名字和字段的名字是区分大小写的,但是字段的值是不区分大小写的。表的名字和字段的名字是否区分大小写,可以查看数据库变量lower_case_table_names的值,0表示区分大小写;1表示不区分,统一按照小写对待。

 mysql> show variables like "%case%";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | |
+------------------------+-------+
rows in set (0.00 sec)

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

 mysql> create table lowupper(
-> name varchar() not null,
-> age int,
-> home varchar() binary);
Query OK, rows affected (0.10 sec) mysql> show create table lowupper;
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| lowupper | CREATE TABLE `lowupper` (
`name` varchar() NOT NULL,
`age` int() DEFAULT NULL,
`home` varchar() CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
row in set (0.00 sec)

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

下面插入数据做些验证:

 mysql> insert lowupper (name, age, home) values ("shihuc", , "Beijing, china");
Query OK, row affected (0.00 sec) mysql>
mysql> insert lowupper (name, age, home) values ("water", , "BEIJING, china");
Query OK, row affected (0.00 sec) mysql> insert lowupper (name, age, home) values ("xiaocheng", , "hubei");
Query OK, row affected (0.00 sec) mysql> insert lowupper (name, age, home) values ("zhangsan", null, "china");
Query OK, row affected (0.00 sec) mysql> insert lowupper (name, age, home) values ("lisi", null, "CHINA");
Query OK, row affected (0.00 sec) mysql> insert lowupper (name, age, home) values ("wangwu", null, "China");
Query OK, row affected (0.00 sec) mysql> select * from lowupper;
+-----------+------+----------------+
| name | age | home |
+-----------+------+----------------+
| shihuc | | Beijing, china |
| water | | BEIJING, china |
| xiaocheng | | hubei |
| zhangsan | NULL | china |
| lisi | NULL | CHINA |
| wangwu | NULL | China |
+-----------+------+----------------+
rows in set (0.00 sec)

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

 mysql> select * from lowupper where home = "china";
+----------+------+-------+
| name | age | home |
+----------+------+-------+
| zhangsan | NULL | china |
+----------+------+-------+
row in set (0.00 sec)

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

 mysql> insert checknull (name, age) values ("SHIHUC", null);
Query OK, row affected (0.00 sec) mysql> select * from checknull;
+--------+------+
| name | age |
+--------+------+
| water | |
| shihuc | NULL |
| SHIHUC | NULL |
+--------+------+
rows in set (0.00 sec) mysql> select * from checknull where name = "shihuc";
+--------+------+
| name | age |
+--------+------+
| shihuc | NULL |
| SHIHUC | NULL |
+--------+------+
rows in set (0.00 sec) mysql> select * from checknull where binary name = "shihuc";
+--------+------+
| name | age |
+--------+------+
| shihuc | NULL |
+--------+------+
row in set (0.00 sec)

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

mysql中的null字段值的处理及大小写问题的更多相关文章

  1. 关于Java读取mysql中date类型字段默认值'0000-00-00'的问题

    今天在做项目过程中,查询一个表中数据时总碰到这个问题:      java.sql.SQLException:Value '0000-00-00' can not be represented as ...

  2. Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?

    Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?先上两种实现方式的实例:$querys["house_type_image"] ...

  3. 更改mysql中当前auto_increment的值的方法

    最近给自己网站更改mysql中当前auto_increment的值 如果在mysql中一个表test中的ID字段设为auto_increment插入两条记录后ID=2,这时删除1条记录,再插入一条变成 ...

  4. mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现?

      mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现? mysql中实现方式如下: select merchantId, NameCn, send_date, deliver_name ...

  5. 【整理】mysql中information_schema.tables字段说明

    [整理]mysql中information_schema.tables字段说明 2016-05-04 16:47:50|  分类: 默认分类|举报|字号 订阅     下载LOFTER我的照片书  | ...

  6. C#比较两个对象中的指定字段值是否相等

    一.创建CompareFieldAttribute标识要比较的字段 using System; namespace CompareObjField { /// <summary> /// ...

  7. Mysql中自增字段(AUTO_INCREMENT)的一些常识

    Mysql中自增字段(AUTO_INCREMENT)的一些常识: http://chengxuyuan.naxieshir.com/fenlei/2/p/151.html

  8. GridView控件RowDataBound事件中获取列字段值的几种途径

    前台: <asp:TemplateField HeaderText="充值总额|账号余额"> <ItemTemplate> <asp:Label ID ...

  9. mysql中查询一个字段属于哪一个数据库中的哪一个表的方式

    mysql中查询一个字段具体是属于哪一个数据库的那一张表:用这条语句就能查询出来,其中 table_schema 是所在库, table_name 是所在表 --mysql中查询某一个字段名属于哪一个 ...

随机推荐

  1. Easy Problem-map和vector的使用

    给出一个包含n个整数的数组,你需要回答若干询问.每次询问包含两个整数k和v,输出从左到右第k个v的下标(数组下标,从左右到右编号1~n). [输入格式] 输入包含多组数据.每组数据第一行为两个整数n和 ...

  2. DEDECMS调用特定ID文章内容的实现方法

    DEDECMS调用特定ID文章内容的实现方法 {dede:loop table='dede_addonarticle' sort='aid' row='8' if='aid=524'} [field: ...

  3. textarea元素在加上runat="server"后运行报错解决

    当出现这个报错的时候,在后台引用相应的命名空间,为 using System.Web.UI; using System.Web.UI.HtmlControls;using System.Web.UI. ...

  4. WebSphere中对response.sendError()的处理与Tomcat不同

    不同的地方在于,同样的代码[response.sendError(1);] 在Tomcat下,response.getResponseCode()的值是 1,而在Websphere下面则是 500. ...

  5. ✡ leetcode 156. Binary Tree Upside Down 旋转树 --------- java

    156. Binary Tree Upside Down Add to List QuestionEditorial Solution My Submissions   Total Accepted: ...

  6. 全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中

    题目名称 改造二叉树 数字对 交换 英文名称 binary pair swap 输入文件名 binary.in pair.in swap.in 输出文件名 binary.out pair.out sw ...

  7. 课堂所讲整理:HTML--7JavaScript的DOM操作

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西. 2.Window对象操作 一.属性和方法: 属性(值或者子对象): op ...

  8. HDU-5792 World is Exploding(树状数组)

    题目大意:给一个整数序列,统计四元组(a,b,c,d)的个数,满足条件1:a<>b<>c<>d:条件2:<a,b>组成一个顺序对,<c,d> ...

  9. hdu5438(2015长春赛区网络赛1002)拓扑序+DFS

    题意:给出一张无向图,每个节点有各自的权值,问在点数为奇数的圈中的点的权值总和是多少. 通过拓扑序的做法标记出所有非圈上的点,做法就是加每条边的时候将两点的入度都加一,然后将所有度数为1的点入队,删去 ...

  10. 【BZOJ1009】【HNOI2008】GT考试

    依旧看人代码写,不过我觉得自己慢慢写一个也可以写成? 原题: 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不 ...