浅谈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 相关文章推荐
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
MySQL分库分表与分区的入门指南
Apr 22 MySQL
MySQL 如何分析查询性能
May 12 MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
MySQL面试题讲解之如何设置Hash索引
Nov 01 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
一次Mysql update sql不当引起的生产故障记录
Apr 01 MySQL
解决MySQL Varchar 类型尾部空格的问题
Apr 06 MySQL
MySQL数据库 任意ip连接方法
May 20 MySQL
sql注入报错之注入原理实例解析
Jun 10 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使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
2016/09/21 PHP
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
jQuery回调函数的定义及用法实例
2014/12/23 Javascript
理解javascript回调函数
2014/12/28 Javascript
在JavaScript中访问字符串的子串
2015/07/07 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
Mac中Python 3环境下安装scrapy的方法教程
2017/10/26 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
2019/08/20 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
python上selenium的弹框操作实现
2020/07/13 Python
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
收银员岗位职责
2015/02/03 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
教师培训简讯
2015/07/20 职场文书
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android
Python实现聚类K-means算法详解
2022/07/15 Python