浅谈mysql返回Boolean类型的几种情况
程序员文章站
2022-04-03 20:34:58
mysql返回boolean类型第一种情况,直接返回select id='22aa' from mytest where age=202 返回1 可封装为trueselect count(*)=1...
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,该方法如下)
至于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 |
对此,我只想说,太坑了!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。