浅谈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 update语句
May 26 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
SQL语句多表联合查询的方法示例
Apr 18 MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
MySQL分布式恢复进阶
Jul 23 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
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 adodb连接不同数据库
2009/03/19 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
PHP对文件进行加锁、解锁实例
2015/01/23 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
JS实现多选框的操作
2020/06/24 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
python设置检查点简单实现代码
2014/07/01 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
Python调用C语言的方法【基于ctypes模块】
2018/01/22 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
个人自荐书
2013/12/20 职场文书
总经理助理工作职责
2014/02/06 职场文书
公司寄语大全
2014/04/10 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python