浅谈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执行计划
May 31 MySQL
浅谈mysql返回Boolean类型的几种情况
Jun 04 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
MySQL基于索引的压力测试的实现
Nov 07 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
MySQL如何使备份得数据保持一致
May 02 MySQL
MySQL 数据 data 基本操作
May 04 MySQL
MySQL数据库 任意ip连接方法
May 20 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 中文字符串首字母的获取函数分享
2013/11/04 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
select组合框option的捕捉实例代码
2008/09/30 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
给before和after伪元素设置js效果的方法
2015/12/04 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
js实现每日签到功能
2018/11/29 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
Java 生成随机字符的示例代码
2021/01/13 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
python实现的简单文本类游戏实例
2015/04/28 Python
python动态加载包的方法小结
2016/04/18 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
python人民币小写转大写辅助工具
2018/06/20 Python
将python图片转为二进制文本的实例
2019/01/24 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
Python3实现二叉树的最大深度
2019/09/30 Python
基于python操作ES实例详解
2019/11/16 Python
Python configparser模块常用方法解析
2020/05/22 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
Python 图片处理库exifread详解
2021/02/25 Python
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
德国帽子专家:Hutshopping
2019/11/03 全球购物
编程用JAVA解析XML的方式
2013/07/07 面试题
夏季药店促销方案
2014/08/22 职场文书
英语辞职信范文
2015/02/28 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
PHP使用QR Code生成二维码实例
2021/07/07 PHP