mysql返回Boolean类型

在这里插入图片描述

第一种情况,直接返回

select id='22aa' from mytest where age=202  返回1 可封装为trueselect count(*)=1 from mytest where age=202  返回1 可封装为trueselect count(*)=0 from mytest where age=202  返回0 可封装为falseselect count(*)<3 from mytest where age=202  返回1 可封装为trueselect count(*)<=1 from mytest where age=202  返回1 可封装为trueselect 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  可封装为trueselect count(*) from mytest  返回4  可封装为Boolean类型,但为falseselect enable from mytest where age=201 返回null  不可封装为Boolean类型,代码会直接报错select id from mytest where age=202   返回'22aa'   可封装为Boolean类型,但为falseselect id from mytest where age=202   返回'true'   可封装为Boolean类型,但为trueselect id from mytest where age=202   返回'false'   可封装为Boolean类型,false//特殊情况select * from mytest  报错Expected one result (or null) to be returned by selectOne(), but found: 4select * from mytest where age=202  返回一组数据false 2019-08-28 202 15 1 ,可以封装为falseselect * from mytest where age=202  返回一组数据true 2019-08-28 202 15 1 ,可以封装为trueselect * 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,该方法如下)

在这里插入图片描述

在这里插入图片描述 至于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 setTime: 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 setTime: 2.162s
> 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 where |

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Android(安卓)后台线程调用前台线程的几种方法
  3. 我今天的面试题,注册广播有几种方式,这些方式有何优缺点?请谈谈Andr
  4. Android(安卓)代码设置Color的几种方式
  5. JS判断终端类型的几种方法
  6. 查看基于Android(安卓)系统单个进程内存、CPU使用情况的几种方法
  7. 浅谈RelativeLayout相对布局
  8. Android中的几种网络请求方式详解
  9. Android实现页面跳转的几种方式(转贴)

随机推荐

  1. PostgreSQL的数据存储(十七)---数据存储
  2. Mssql根据表名获取字段
  3. 这被认为是正常形式的失败吗?
  4. 建议一种有效的查询方式
  5. Code First for Mysql 错误:未为提供程序
  6. sql语句,order by后加参数问题
  7. mybatis中 insert into select 批量生成u
  8. ORA-19909:当进行不完全恢复之后使用open
  9. sql 2005判断某个表或某个表中的列是否存
  10. MySQL中的类Decode用法