浅谈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 27 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
MySQL大小写敏感的注意事项
May 24 MySQL
MySQL 外键约束和表关系相关总结
Jun 20 MySQL
mysql联合索引的使用规则
Jun 23 MySQL
Mysql排序的特性详情
Nov 01 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
mysql 获取时间方式
Mar 20 MySQL
浅谈MySQL中的六种日志
Mar 23 MySQL
单机多实例部署 MySQL8.0.20
May 15 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 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 全文搜索和替换的实现代码
2008/07/29 PHP
PHP 判断变量类型实现代码
2009/10/23 PHP
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
奇妙的js
2007/09/24 Javascript
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
jQuery插件zTree实现获取一级节点数据的方法
2017/03/08 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
Python开发的实用计算器完整实例
2017/05/10 Python
python处理excel绘制雷达图
2019/10/18 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
Python内置函数及功能简介汇总
2020/10/13 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
会计与审计专业大专生求职信
2013/10/03 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
2015新学期开学寄语
2015/02/26 职场文书
自我检讨书怎么写
2015/05/07 职场文书
2016干部作风整顿心得体会
2016/01/22 职场文书