浅谈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 14 MySQL
详解MySQL事务的隔离级别与MVCC
Apr 22 MySQL
如何用Navicat操作MySQL
May 12 MySQL
MySQL 存储过程的优缺点分析
May 20 MySQL
MySQL 全文索引使用指南
May 25 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
Mysql中调试存储过程最简单的方法
Jun 30 MySQL
MySQL系列之十四 MySQL的高可用实现
Jul 02 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
mysql数据库如何转移到oracle
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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
PHP截取IE浏览器并缩小原图的方法
2016/03/04 PHP
php数组指针操作详解
2017/02/14 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
制作特殊字的脚本
2006/06/26 Javascript
jquery 简单导航实现代码
2009/09/11 Javascript
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
2010/04/13 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
jQuery中库的引用方法
2018/01/06 jQuery
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
Python跳出多重循环的方法示例
2019/07/03 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
女大学生个人求职信
2013/12/09 职场文书
中国梦的演讲稿
2014/01/08 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
青岛导游词
2015/02/12 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL
Go语言测试库testify使用学习
2022/07/23 Golang