在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. 循环列表的Java实现,解决约瑟夫环问题

    import java.util.Scanner; /** * 循环列表的Java实现,解决约瑟夫环问题 * * @author LIU * */ public class LinkedList { ...

  2. Core Java Volume I — 3.4. Variables

    3.4. VariablesIn Java, every variable has a type. You declare a variable by placing the type first, ...

  3. 堆(Heap)和二叉堆(Binary heap)

    堆(Heap) The operations commonly performed with a heap are: create-heap: create an empty heap heapify ...

  4. SFTP 上传文件夹

    使用sftp上传文件夹时若使用如下命令并不work: put /media/Research/GWAS_Class/* Desktop/ 此时,需要添加一个参数 -r, 另外在目标文件夹下面建立一个同 ...

  5. 16年大连网络赛 1006 Football Games

    题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?cid=725&pid=1006 Football Games Time ...

  6. LA 3644 易爆物 并查集

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  7. HDU 2072 单词数

    题目链接  http://acm.hdu.edu.cn/showproblem.php?pid=2072 普通解法: /* HDU 2072 单词数 --- 字符串处理 */ #include < ...

  8. U盘

    U盘里的.Trashes是什么文件,要怎么去掉?为什么会出现这个文件? 这是苹果电脑的垃圾文件. 1.在苹果电脑上删除文件后,没有清空回收站,就会留下这些文件. 2.可以重新插入Mac, 然后会发现T ...

  9. IOS&swift开发常用的网站

    swift转OC:http://iswift.org/try OC转swift:https://www.myappconverter.com/ swift语言视频:http://space.bilib ...

  10. android:versionCode和android:versionName 用途

    本文转载自:http://blog.csdn.net/wh_19910525/article/details/8660416 Android的版本可以在androidmainfest.xml中定义,主 ...