浅谈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部分操作
Apr 05 MySQL
MySQL表的增删改查基础教程
Apr 07 MySQL
如何用Navicat操作MySQL
May 12 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
新手入门Mysql--概念
Jun 18 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 MySQL
MySQL Server 层四个日志
Mar 31 MySQL
MySQL分区路径子分区再分区
Apr 13 MySQL
MySQL池化框架学习接池自定义
Jul 23 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 MySQL
详解MySQL的内连接和外连接
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
PHP访问Google Search API的方法
2015/03/05 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
Javascript this指针
2009/07/30 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
Vue进度条progressbar组件功能
2018/04/17 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
解决layui使用layui-icon出现默认图标的问题
2019/09/11 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
如何用SQL语句进行模糊查找
2015/09/25 面试题
函授自我鉴定
2013/11/06 职场文书
大学生职业生涯设计书
2014/01/02 职场文书
人力资源经理自我评价
2014/01/04 职场文书
岗位竞聘演讲稿范文
2014/04/24 职场文书
增员口号大全
2014/06/18 职场文书
2014年项目工作总结
2014/11/24 职场文书
班主任寄语2016
2015/12/04 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
MySQL快速插入一亿测试数据
2021/06/23 MySQL
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript