浅谈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 Show Profile
Apr 05 MySQL
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
Mysql systemctl start mysqld报错的问题解决
Jun 03 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
MySQL中的布尔值,怎么存储false或true
Jun 04 MySQL
mysql脏页是什么
Jul 26 MySQL
Mysql数据库手动及定时备份步骤
Nov 07 MySQL
MySQL常见优化方案汇总
Jan 18 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
教你如何让spark sql写mysql的时候支持update操作
Feb 15 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
Mysql查询时间区间日期列表,不会由于数据表数据影响
Apr 19 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
风味层面去分析咖啡油脂
2021/03/03 咖啡文化
基于MySQL体系结构的分析
2013/05/02 PHP
解析coreseek for sphinx的使用
2013/06/21 PHP
3种php生成唯一id的方法
2015/11/23 PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
2017/05/04 PHP
Javascript 强制类型转换函数
2009/05/17 Javascript
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
Nodejs实现批量下载妹纸图
2015/05/28 NodeJs
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
2017/01/05 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
python中文乱码的解决方法
2013/11/04 Python
用Python程序抓取网页的HTML信息的一个小实例
2015/05/02 Python
Python实现堆排序的方法详解
2016/05/03 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Django中Model的使用方法教程
2018/03/07 Python
Python之列表的插入&amp;替换修改方法
2018/06/28 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
C#可否对内存进行直接的操作
2015/02/26 面试题
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
驾驶员培训方案
2014/05/01 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
2015年社区工会工作总结
2015/05/26 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
win10壁纸在哪个文件夹 win10桌面背景图片文件位置分享
2022/08/05 数码科技