浅谈mysql返回Boolean类型的几种情况


Posted in MySQL onJune 04, 2021

mysql返回Boolean类型

浅谈mysql返回Boolean类型的几种情况

第一种情况,直接返回

select id='22aa' from mytest where age=202  返回1 可封装为true
select count(*)=1 from mytest where age=202  返回1 可封装为true
select count(*)=0 from mytest where age=202  返回0 可封装为false
select count(*)<3 from mytest where age=202  返回1 可封装为true
select count(*)<=1 from mytest where age=202  返回1 可封装为true
select name="aa" from mytest where age=10  当name为null时,sql不会报错,返回结果也为nul,参照第二种情况的sql 3 代码会报错

总结:

这种情况类似于java中的判断语句。只是java中=是赋值的意思,所以用了==来做判断,而mysql中赋值用set,判断就直接用=。

第二种情况,返回0或者1也能达到目的

select enable from mytest where age=202  返回1  可封装为true
select count(*) from mytest  返回4  可封装为Boolean类型,但为false
select enable from mytest where age=201 返回null  不可封装为Boolean类型,代码会直接报错
select id from mytest where age=202   返回'22aa'   可封装为Boolean类型,但为false
select id from mytest where age=202   返回'true'   可封装为Boolean类型,但为true
select id from mytest where age=202   返回'false'   可封装为Boolean类型,false
//特殊情况
select * from mytest  报错Expected one result (or null) to be returned by selectOne(), but found: 4
select * from mytest where age=202  返回一组数据false 2019-08-28 202 15 1 ,可以封装为false
select * from mytest where age=202  返回一组数据true 2019-08-28 202 15 1 ,可以封装为true
select * from mytest where age=202  返回一组数据aaaa2019-08-28 202 15 1 ,可以封装为false

总结:

Mybatis是根据查询到的记录数进行转换的(1=true,0=false)

需要注意的地方:如果查询到多条记录(大于1),返回的却是false, 这时就与我们的期望的刚好相反。这里,可以换其它方法,可以通过返回记录数,进行判断,也可以保证记录在数据库是唯一的。也可以直接用第一种情况解决。

根据第4、5、6条sql语句的测试,如果字符串是"true",就可以封装为true,如果为"false"就可以封装为false,其他情的字符串都为false。

(猜测,并不准确,需要到mysql官网上来查,如果返回的字段是字符串,将其转为Boolean时是按什么规则转换的,猜测是类似于java中的字符串转Boolean方法:Boolean.valueOf(“aaa”) //false,该方法如下)

浅谈mysql返回Boolean类型的几种情况

浅谈mysql返回Boolean类型的几种情况 至于8、9、10的sql返回一组,而接受数据的只要一个时的情况,为什么就取了id的值来封装,有待继续研究。

MySQL Boolean类型的坑

MySQL中,Boolean只是 tinyint(1) 的别名,也就是说,MySQL中并没有真正的bool类型。而SQLAlchemy生成SQL的时候并没有检测到 这一点,这就导致一个问题,当使用 bool 类型作为查询条件时,用不上索引,从而导致扫表的行为:

> SELECT COUNT(*) FROM message WHERE message.is_national = 1 AND message.updated_at > '2020-01-01 00:00:00' AND message.deleted_at IS NULL;
+----------+
| COUNT(*) |
+----------+
| 0        |
+----------+
1 row in set
Time: 0.018s
> SELECT COUNT(*) FROM message WHERE message.is_national is true AND message.updated_at > '2020-01-01 00:00:00' AND message.deleted_at IS NULL;
+----------+
| COUNT(*) |
+----------+
| 0        |
+----------+
1 row in set
Time: 2.162s

注意观察第一行和第二行的时间,很明显第二行没有用上索引,我们来看看 EXPLAIN 的结果便知道了:

> EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national = 1 AND message.updated_at > '2020-01-01 00:00:00' AND message.de
        leted_at IS NULL;
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1  | SIMPLE | message | ref  | ix_message_updated_at,idx_updated_at_is_national,ix_message_is_national | ix_message_is_national | 1 | const | 1 | Using where |

> EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national is true AND message.updated_at > '2020-01-01 00:00:00' AND messag
        e.deleted_at IS NULL;
| id | select_type | table   | type | possible_keys | key    | key_len | ref    | rows    | Extra |
| 1  | SIMPLE | message | ALL  | ix_message_updated_at,idx_updated_at_is_national | <null> | <null>  | <null> | 一个很大的数字 | Using whe
re |

对此,我只想说,太坑了!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

MySQL 相关文章推荐
Mysql MVCC机制原理详解
Apr 20 MySQL
MySQL安装后默认自带数据库的作用详解
Apr 27 MySQL
解决MySQL存储时间出现不一致的问题
Apr 28 MySQL
MySQL数字类型自增的坑
May 07 MySQL
MySQL CHAR和VARCHAR该如何选择
May 31 MySQL
Navicat连接MySQL错误描述分析
Jun 02 MySQL
MySQL索引失效的典型案例
Jun 05 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
MySQL数据库 安全管理
May 06 MySQL
Mysql 设置boolean类型的操作
Jun 04 #MySQL
MySQL中的布尔值,怎么存储false或true
mysql外连接与内连接查询的不同之处
Mysql systemctl start mysqld报错的问题解决
Jun 03 #MySQL
你知道哪几种MYSQL的连接查询
Jun 03 #MySQL
MySQL中in和exists区别详解
Jun 03 #MySQL
MySQL 不等于的三种使用及区别
Jun 03 #MySQL
You might like
php下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
PHP静态成员变量和非静态成员变量详解
2017/02/14 PHP
PHP编辑器PhpStrom运行缓慢问题
2017/02/21 PHP
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
vue2 中二级路由高亮问题及配置方法
2019/06/10 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
Python中List.count()方法的使用教程
2015/05/20 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
python检测服务器端口代码实例
2019/08/31 Python
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
vue路由实现登录拦截
2021/03/24 Vue.js
师范应届毕业生自荐信
2013/11/18 职场文书
教师自我评价范文
2013/12/16 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
护士节慰问信
2015/02/15 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书