服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 浅谈mysql返回Boolean类型的几种情况

浅谈mysql返回Boolean类型的几种情况

2021-08-12 20:04海棠xun Mysql

这篇文章主要介绍了mysql返回Boolean类型的几种情况,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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 |

对此,我只想说,太坑了!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/weixin_44457814/article/details/102704614

延伸 · 阅读

精彩推荐
  • Mysql如何快速使用mysqlreplicate搭建MySQL主从

    如何快速使用mysqlreplicate搭建MySQL主从

    mysql-utilities工具集是一个集中了多种工具的合集,可以理解为是DBA的工具箱,本文介绍利用其中的mysqlreplicate工具来快速搭建MySQL主从环境。下面和小编一起...

    dbapower2422020-09-27
  • Mysql3步搞定纯真IP数据导入到MySQL的方法详解

    3步搞定纯真IP数据导入到MySQL的方法详解

    免编程,3步搞定纯真IP数据导入到MySQL详解,好多做ip地址查询的朋友用的到。 ...

    mysql教程网5522019-11-01
  • MysqlWindow10下mysql 5.7.21 安装配置方法图文教程

    Window10下mysql 5.7.21 安装配置方法图文教程

    这篇文章主要为大家详细介绍了Window10下mysql 5.7.21 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    NepalTrip2482020-09-05
  • MysqlMySQL SHOW PROCESSLIST协助故障诊断全过程

    MySQL SHOW PROCESSLIST协助故障诊断全过程

    这篇文章主要给大家介绍了关于MySQL SHOW PROCESSLIST协助故障诊断的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习...

    彭东稳4302019-06-05
  • MysqlB-树的插入过程介绍

    B-树的插入过程介绍

    今天小编就为大家分享一篇关于B-树的插入过程介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    李灿辉4992020-09-10
  • Mysql深度解析MySQL 5.7之临时表空间

    深度解析MySQL 5.7之临时表空间

    尽管临时表在实际在线场景中很少会去显式使用,但在某些运维场景还是需要到的,在MySQL5.7中,专门针对临时表做了些优化,下面这篇文章我们来一起深...

    杨涛涛5012020-07-06
  • MysqlMySQL命令行删除表中的一个字段

    MySQL命令行删除表中的一个字段

    本文介绍在MySQL数据库中,如何根据字段名来删除表中的一个字段,需要的朋友可以参考下 ...

    MYSQL教程网2642020-06-04
  • MysqlMySQL 独立索引和联合索引的选择

    MySQL 独立索引和联合索引的选择

    为了提高数据库效率,建索引是家常便饭;那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?...

    岛上码农6472021-07-15