浅谈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 使用SQL语句修改表名的实现
Apr 07 MySQL
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
如何设计高效合理的MySQL查询语句
May 26 MySQL
MySQL如何解决幻读问题
Aug 07 MySQL
深入解析MySQL索引数据结构
Oct 16 MySQL
MySQL 数据类型详情
Nov 11 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
JMeter对MySQL数据库进行压力测试的实现步骤
Jan 22 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
MySQL索引失效场景及解决方案
Jul 23 MySQL
MySQL 原理与优化之Update 优化
Aug 14 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 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
批量修改RAR文件注释的php代码
2010/11/20 PHP
php英文单词统计器
2016/06/23 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
详解PHP队列的实现
2019/03/14 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
2013/12/12 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
Python实现从订阅源下载图片的方法
2015/03/11 Python
Python中用format函数格式化字符串的用法
2015/04/08 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
会计专业个人自我鉴定
2014/03/21 职场文书
2014年接待工作总结
2014/11/26 职场文书
安全保证书
2015/01/16 职场文书
2015毕业寄语大全
2015/02/26 职场文书
创业计划书之美容店
2019/09/16 职场文书
德劲DE1108畅想
2021/04/22 无线电
MySQL系列之六 用户与授权
2021/07/02 MySQL
python3 字符串str和bytes相互转换
2022/03/23 Python