• 问题 :

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

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. Windows Phone动画

    从事Windows Phone开发已经有一段时间了,但是一直没有好好的静下心来梳理一下自己这段时间的知识,一是怕自己学问不到家,写不出那些大牛一般的高屋建瓴:二是以 前一直没有写博客的习惯:好了废话不 ...

  2. Silverlight 调用 aspx 相关文件

    private void Button_Click_1(object sender, RoutedEventArgs e) { WebClient wb = new WebClient(); wb.D ...

  3. Entity Framework学习笔记(二)----CRUD(1)

    请注明转载地址:http://www.cnblogs.com/arhat 这篇文章老魏和大家分享一下Entity Framework的CRUD操作,在这之前呢,老魏先说一下老魏对EF的一个整体的认识, ...

  4. 如何安装altium designer 10

    http://jingyan.baidu.com/article/4dc4084881e2bdc8d946f1f3.html

  5. 函数 swift

    func add(a:Int,b:Int)->Int { return a+b }

  6. 解决ubuntu字体发虚,网页字体发虚

    好吧,哥也不知所以然,只是突然间所有东西的字体都发虚了~~后来发现是应该是语言支持搞的鬼,卸载掉下面的东东就没事了 sudo apt-get remove fonts-arphic-ukai ttf- ...

  7. 【每日scrum】NO.5

    尝试采用自己的地图,绘点并计算路径,但是地图打开出现问题.

  8. JBOSS和WebLogic区别

    JBoss: 1.  JBoss开放源代码Java EE实现,成本低,好控制. 2.  JBoss需要的内存和硬盘空间比较小,但是只适合做小项目. 3.  安装非常简单.先解压缩JBoss打包文件再配 ...

  9. java中的IO流之文件复制

    O(∩_∩)O哈哈~ 1.综述 一门成熟的语言肯定具备的几个模块:IO,通信,线程,UI...... Java作为一门成熟的程序语言,其IO流是比较复杂的.上个图大家感受下: 简单分析一下,IO分为两 ...

  10. 【LCA】CodeForce #326 Div.2 E:Duff in the Army

    C. Duff in the Army Recently Duff has been a soldier in the army. Malek is her commander. Their coun ...