浅谈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 07 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
MySQL触发器的使用
May 24 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
MySQL的Query Cache图文详解
Jul 01 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
MySQL Server 层四个日志
Mar 31 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 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实现异步调用方法研究与分享
2011/10/27 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
jquery EasyUI的formatter格式化函数代码
2011/01/12 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
2013/04/17 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
跟我学习javascript的循环
2015/11/18 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
js new Date()实例测试
2019/10/31 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
什么是CSS3 HSLA色彩模式?HSLA模拟渐变色条
2016/04/26 HTML / CSS
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
XML文档面试题
2015/08/05 面试题
打架检讨书300字
2014/02/02 职场文书
推荐信格式要求
2014/05/09 职场文书
软环境建设心得体会
2014/09/09 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
总结高并发下Nginx性能如何优化
2021/11/01 Servers