浅谈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
详解MySQL中的主键与事务
May 27 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
SQL基础的查询语句
Nov 11 MySQL
Mysql多层子查询示例代码(收藏夹案例)
Mar 31 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
MySQL数据管理操作示例讲解
Dec 24 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程序中的常见漏洞进行攻击
2006/10/09 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
php实现用户登陆简单实例
2017/04/04 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
了解在JavaScript中将值转换为字符串的5种方法
2019/06/06 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
js实现简单页面全屏
2019/09/17 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
Django模型验证器介绍与源码分析
2020/09/08 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
致全体运动员广播稿
2014/02/01 职场文书
法人代表授权委托书
2014/04/08 职场文书
小摄影师教学反思
2014/04/27 职场文书
学会感恩主题班会
2015/08/12 职场文书
Python OpenCV快速入门教程
2021/04/17 Python
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python
MySQL 开窗函数
2022/02/15 MySQL