• 问题 :

  我在看以前的一个开发者的代码时看到

WHERE p.name <=> NULL

在这个查询语句中 <=>符号是什么意思啊?是不是和 =号是一样啊?还是一个语法错误啊?但是没有显示任何错误或者异常。我已经知道了mysql中的 <> = !=等符号。

  • 最佳回答 :
  1. 和=号的相同点

  像常规的=运算符一样,两个值进行比较,结果是0(不等于)或1(相等);换句话说:’A'<=>’B'得0和’a'<=>’a‘得1。

  2.和=号的不同点

  和=运算符不同的是,NULL的值是没有任何意义的。所以=号运算符不能把NULL作为有效的结果。所以:请使用<=>,

  'a' <=> NULL 得0   NULL<=> NULL 得出 1。和=运算符正相反,=号运算符规则是 'a'=NULL 结果是NULL 甚至NULL = NULL 结果也是NULL。顺便说一句,mysql上几乎所有的操作符和函数都是这样工作的,因为和NULL比较基本上都没有意义。

  • 用处

  当两个操作数中可能含有NULL时,你需要一个一致的语句。

... WHERE col_a <=> ? ...

这里的占位符有可能是常量也有可能是NULL,当使用<=>运算符时,你没有必要对查询语句做任何修改。

  • 相关操作符

  除了 <=> ,还有两个其他的操作符用来处理某个值和NULL做比较,也就是IS NULL and IS NOT NULL。他们是ANSI标准中的一部分,因此也可以用在其他数据库中。而<=>只能在mysql中使用。

  你可以把<=>当作mysql中的方言。

'a' IS NULL     ==> 'a' <=> NULL

'a' IS NOT NULL ==> NOT('a' <=> NULL)

据此,你可以把这个查询语句段改的更具移植性一点:

WHERE p.name IS NULL

举一个存储过程的示例:

BEGIN

    DECLARE v_result INT DEFAULT 0;
DECLARE v_password VARCHAR(64) DEFAULT NULL;
DECLARE v_createtime TIMESTAMP DEFAULT NULL;
DECLARE v_status INT DEFAULT NULL;
DECLARE v_gamename VARCHAR(32) DEFAULT NULL;
DECLARE v_faceid INT DEFAULT 0;
DECLARE v_faceurl VARCHAR(260) DEFAULT '';
DECLARE v_idno VARCHAR(32) DEFAULT NULL;
DECLARE v_age INT DEFAULT 0;
DECLARE v_anti_indulge INT DEFAULT 1; IF NOT(p_userid <=> NULL) AND NOT(p_passwd <=> NULL) THEN SELECT
`password`, `createtime`, `status`
INTO
v_password, v_createtime, v_status
FROM
`tbl_user`
WHERE
`id` = p_userid; IF v_password <=> NULL OR LOWER(v_password) != LOWER(p_passwd) THEN
SET v_result = -1;
SET v_createtime = NULL;
SET v_status = NULL;
SET p_userid = NULL;
END IF;
#get gamename
SELECT user_gamename INTO v_gamename FROM tbl_user_gamename WHERE user_id = p_userid LIMIT 1;
#get gameface
SELECT IFNULL(face_id,0),IFNULL(faceurl,'') INTO v_faceid,v_faceurl FROM tbl_user_gameface WHERE user_id = p_userid LIMIT 1;
#get age
SELECT id_number INTO v_idno FROM tbl_userinfo WHERE user_id = p_userid LIMIT 1;
IF NOT(v_idno <=> NULL) THEN
## 通过身份证获取用户年龄
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(RIGHT(LEFT(v_idno, 14), 8))), '%Y') + 0 AS age INTO v_age ;
IF v_age >= 18 THEN
SET v_anti_indulge = 0;
END IF;
END IF;
ELSE SET v_result = -1;
SET v_createtime = NULL;
SET v_status = NULL;
SET p_userid = NULL; END IF; SELECT v_result AS `Result`, p_userid AS `userid`, v_createtime AS `createtime`, v_status AS `status`, v_gamename AS `gamename`,v_faceid AS `faceid`,v_faceurl AS `faceurl`, v_anti_indulge AS `anti_indulge`; END

存储过程的参数是:IN `p_userid` VARCHAR(64), IN `p_passwd` VARCHAR(64)

如何理解 MySQL 中的 <=> 操作符?的更多相关文章

  1. MySql 中的<=>操作符

    今天在学习数据库的索引优化时,关于memory存储引擎的的hash索引时,看到了操作符<=> ,这个操作符还是第一次见到,于是上网查了一下.我想大家应该知道 =  !=   <> ...

  2. 正确理解MySQL中的where和having的区别

    原文:https://blog.csdn.net/yexudengzhidao/article/details/54924471 以前在学校里学习过SQLserver数据库,发现学习的都是皮毛,今天以 ...

  3. 如何理解MySQL中auto_increment?

    1.auto_increment用于主键自动增长.比如从1开始增长,当把第一条数据删除,再插入第二条数据时,主键值为2,不是1.

  4. 深入理解MySQL中的Redo、Undo、MVCC

    http://edu.csdn.net/course/detail/3495 http://edu.csdn.net/courses/o317_a3/云计算大数据

  5. mysql中的几种日志了解

    前言 MySQL中有以下日志文件,分别是: 1:重做日志(redo log) 2:回滚日志(undo log) 3:二进制日志(binlog) 4:错误日志(errorlog) 5:慢查询日志(slo ...

  6. MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  7. 深入理解 MySQL ——锁、事务与并发控制

    本文首发于vivo互联网技术微信公众号 mp.weixin.qq.com/s/JFSDqI5ya… 作者:张硕 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结, ...

  8. [转帖]2019-03-26 发布 深入理解 MySQL ——锁、事务与并发控制

    深入理解 MySQL ——锁.事务与并发控制 https://segmentfault.com/a/1190000018658828 太长了 没看完.. 数据库 并发  mysql 639 次阅读   ...

  9. [转帖]深入理解 MySQL—锁、事务与并发控制

    深入理解 MySQL—锁.事务与并发控制 http://www.itpub.net/2019/04/28/1723/ 跟oracle也类似 其实所有的数据库都有相同的机制.. 学习了机制才能够更好的工 ...

随机推荐

  1. golang的并发

    Golang的并发涉及二个概念: goroutine channel goroutine由关键字go创建. channel由关键字chan定义 channel的理解稍难点, 最简单地, 你把它当成Un ...

  2. 浅谈.NET中闭包

    什么是闭包 闭包可以从而三个维度来说明.在编程语言领域,闭包是指由函数以及与函数相关的上下文环境组合而成的实体.通过闭包,函数与其上下文变量之间建立起关联关系,上下文变量的状态可以在函数的多次调用过程 ...

  3. perl DBI 学习总结(转载)

    perl DBI 学习总结 源文地址:http://blog.csdn.net/like_zhz/article/details/5441946 DBI和DBD的不同关系模型: ########### ...

  4. cocos中常用到的单例模式

    单例:即只有一个类对象,且提供全局的访问权限 特点: 1.构造函数私有 2.私有的静态成员指针,标识是否已产生了单例实例 3.提供一个getInstance()方法来获取单例对象 下面已打飞机中的子弹 ...

  5. Sprint计划会议1

    会议时间:4.15.晚9点 会议地点:学一食堂2楼 会议进程 • 首先我们讨论了实验第一个Sprint1要实现的功能(用户登录及信息录入).•  之后对任务进行了认领.•  最后每个人对自己的任务进行 ...

  6. 再论 ASP.NET 中获取客户端IP地址

    说到IP获取无非是我们常见的以下几种方式,但是具体获取的值具体区别在哪?网上不乏相关文章,说的也是很详细,但是真正使用起来,还有很多不太对的地方.IP在不同系统中,应用相当广泛,常见的日志记录.广告分 ...

  7. Python中的List,Tuple,Dic,Set

    Python中的List,Tuple,Dic,Set List定义 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推 ...

  8. Linux常用命令查看日志

    cattail -f日 志 文 件 说 明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日 ...

  9. OpenFramework中视频或者图片进行中心旋转、平移、放大、缩小、矫正(本例以视频为准,只给出主要代码)

    /********** update mesh部分***********/ for(int i=0;i<4;i++) {  mesh[i].clear(); //重要,不加的话,移动视频的四个角 ...

  10. 如何ping通两台计算机

    如何ping通两台计算机 因为ping是基于IP协议的,所以,先要保证两台计算机在同一个子网中,这里涉及到vlan和子网的概念 若两台主机不在同一个子网中则无法ping通 若两台主机在同一个子网中却p ...