浅谈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 22 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
一次MySQL启动导致的事故实战记录
Sep 15 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
MySQL实战记录之如何快速定位慢SQL
Mar 23 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
MySQL transaction事务安全示例讲解
Jun 21 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中文分词系统SCWS安装和使用实例
2014/04/11 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
Javascript Cookie读写删除操作的函数
2010/03/02 Javascript
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
React 组件间的通信示例
2018/06/14 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
vue中过滤器filter的讲解
2019/01/21 Javascript
记录一次开发微信网页分享的步骤
2019/05/07 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
python斐波那契数列的计算方法
2018/09/27 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
linux面试相关问题
2013/04/28 面试题
小学校园之星事迹材料
2014/05/16 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript