• 问题 :

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

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. 发布项目MVC4-EF6.0出错

    出错: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFram ...

  2. shell 编程基础

    1 创建shell脚本文件 要创建一个shell脚本文件,必须在第一行指定要使用的shell,其格式为: #! /bin/bash 接着加上该shell文件的注释,说明该脚本文件用来干什么,有谁创建, ...

  3. [转]WinExec、ShellExecute和CreateProcess及返回值判断方式

    [转]WinExec.ShellExecute和CreateProcess及返回值判断方式 http://www.cnblogs.com/ziwuge/archive/2012/03/12/23924 ...

  4. LoadRunner - 结果分析 / Result Analysis

    LoadRunner 最重要也是最难理解的地方--测试结果的分析.其余的录制和加压测试等设置对于我们来讲通过几次操作就可以轻松掌握了.针对 Results Analysis 我用图片加文字做了一个例子 ...

  5. Ubuntu14.04安装配置ndnSIM

    Ubuntu14.04安装配置ndnSIM 预环境 Ubuntu14.04官方系统 请先使用sudo apt-get update更新一下源列表 安装步骤 安装boost-lib sudo apt-g ...

  6. 通过修改注册表来破解sqlyog

    Sqlyog作为一款可视化的数据库管理工具,各种方便我就不说了,但是未经汉化或者绿色过的软件存在30天的生命期,到期后我们就不可以使用了,要摸卸载重装,我们还可以去修改注册表,来延长它的生命期,具体步 ...

  7. 微软职位内部推荐-Senior Software Development Engineer H/F

    微软近期Open的职位: Microsoft Engineering Center Paris (Xbox Music et Video) : Ingénieur en développement l ...

  8. ORA-12154:TNS:无法解析指定的连接标识符

    ORA-12154:TNS:无法解析指定的连接标识符 1问题的描述 Oracle11g server 64bit服务器端安装在Windows Server2008 Enterprise上,安装Orac ...

  9. Struts2入门教程

    最近闲来无事,学习s2sh框架,这里先写一点struts2的入门 我的环境 eclipse 4.3.2 tomcat 7.0.52 jdk 1.7.0_45 struts2 2.3.16.3 在ecl ...

  10. Netsharp快速入门(之19) 平台常用功能(插件操作)

    作者:秋时 暗影  转载须说明出处 6.2     插件操作 6.2.1  停用/启用 1.在平台工具-插件管理,右击对应的插件可以使用启用和停用功能.插件停用后会把所有相关的页签.程序集.服务全部停 ...