mysql中的null字段值的处理及大小写问题
在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字段值的处理及大小写问题的更多相关文章
- 关于Java读取mysql中date类型字段默认值'0000-00-00'的问题
今天在做项目过程中,查询一个表中数据时总碰到这个问题: java.sql.SQLException:Value '0000-00-00' can not be represented as ...
- Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?
Thinkphp中查询复杂sql查询表达式,如何表达MYSQL中的某字段不为空is not null?先上两种实现方式的实例:$querys["house_type_image"] ...
- 更改mysql中当前auto_increment的值的方法
最近给自己网站更改mysql中当前auto_increment的值 如果在mysql中一个表test中的ID字段设为auto_increment插入两条记录后ID=2,这时删除1条记录,再插入一条变成 ...
- mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现?
mysql中根据一个字段相同记录写递增序号,如序号结果,如何实现? mysql中实现方式如下: select merchantId, NameCn, send_date, deliver_name ...
- 【整理】mysql中information_schema.tables字段说明
[整理]mysql中information_schema.tables字段说明 2016-05-04 16:47:50| 分类: 默认分类|举报|字号 订阅 下载LOFTER我的照片书 | ...
- C#比较两个对象中的指定字段值是否相等
一.创建CompareFieldAttribute标识要比较的字段 using System; namespace CompareObjField { /// <summary> /// ...
- Mysql中自增字段(AUTO_INCREMENT)的一些常识
Mysql中自增字段(AUTO_INCREMENT)的一些常识: http://chengxuyuan.naxieshir.com/fenlei/2/p/151.html
- GridView控件RowDataBound事件中获取列字段值的几种途径
前台: <asp:TemplateField HeaderText="充值总额|账号余额"> <ItemTemplate> <asp:Label ID ...
- mysql中查询一个字段属于哪一个数据库中的哪一个表的方式
mysql中查询一个字段具体是属于哪一个数据库的那一张表:用这条语句就能查询出来,其中 table_schema 是所在库, table_name 是所在表 --mysql中查询某一个字段名属于哪一个 ...
随机推荐
- NSFileHandle 、 沙箱机制 、 属性列表
1 使用NSFilehandle进行数据读写 1.1 问题 NSFileManager用于实现对文件的操作,而NSFileHandle是IOS提供的对文件内容(二进制数据)进行操作的类,例如数据的读写 ...
- Azure SQL 数据库弹性池现已面市
我们高兴地宣布Azure SQL 数据库弹性池现已正式面市.弹性池自去年试运行以来,得到许多软件即服务(SaaS)供应商和企业开发人员的认可,他们利用弹性池管理持续增长的云数据库和应用程序,成果高效. ...
- node模拟http服务器session机制-我们到底能走多远系列(36)
我们到底能走多远系列(36) 扯淡: 年关将至,总是会在一些时间节点上才感觉时光飞逝,在平时浑浑噩噩的岁月里都浪费掉了太多的宝贵.请珍惜! 主题: 我们在编写http请求处理和响应的代码的时 ...
- 在centos使用rpm包的方式安装mysql,以及更改root密码
在centos使用rpm包的方式安装mysql,对于centos官方实际推荐使用yum进行安装,下载安装的方式主要用于内网服务器不能连接外网yum源的情况. 下载包 首先根据centos版本在mysq ...
- [POJ] 3277 .City Horizon(离散+线段树)
来自这两篇博客的总结 http://blog.csdn.net/SunnyYoona/article/details/43938355 http://m.blog.csdn.net/blog/mr_z ...
- Javascript中的函数、this以及原型
关于函数 在Javascript中函数实际上就是一个对象,具有引用类型的特征,所以你可以将函数直接传递给变量,这个变量将表示指向函数“对象"的指针,例如: function test(mes ...
- boot/bootsect.S
!! SYS_SIZE is the number of clicks (16 bytes) to be loaded.! 0x7F00 is 0x7F000 bytes = 508kB, more ...
- PHP部分---字符串处理(文中例子不断更新);
字符串处理: 1.去除 ltrim(),rtrim()函数 trim()函数 trim(字符串名)函数:--去掉字符串两边的空格 ltrim(字符串名,“特殊字符”);--去除字符串左边的空格和 ...
- 字符串p型编码
总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串12234411 ...
- 4-2 光盘yum源搭建
yum源默认是用网络作为yum源,在一些特殊情况下,比如教学.实验室等,不是所有的环境都可以联网 这种不能使用网络的情况下,可以使用光盘搭建yum源 我们知道,光盘包含了所有的rpm包,因此使用光盘搭 ...