为什么mysql中IS TRUE和=True的结果不一样?

为什么mysql中IS TRUE和=True的结果不一样?

我有一张user表,结构如下:
image.png
表中数据如下:
image.png
我尝试查询sql:

SELECT * FROM `user` WHERE is_deleted IS TRUE 

结果为:
image.png
查询sql:

SELECT * FROM `user` WHERE is_deleted = TRUE 

结果为:
image.png

我用true或者false作为查询条件是因为:在java中tinyint能被转成Boolean,所以在查询的时候能直接传true或者false

有没有大佬知道为什么结果不一样呢?

阅读 2k
3 个回答

= 做的是数值比较,TRUE 是 1 ,并不等于 127 。
IS TRUE 做的是真假判断,非零都为真。

头像头饰
唯一丶
    23.1k103741
    美国弗吉尼亚州文特山农场

    我自己测试了下:image.png
    a字段上有索引
    分别执行两句得到的结果:
    image.png
    = true 的情况下,ref = const,使用了常量去引用索引
    image.png
    is true 的情况下,mysql走了全表扫描,每个值都匹配,推测应该是索引中对此值的区分度不大,所以优化走了全表扫描
    算是印证了楼上两位
    下面是我gpt的:
    *在大多数数据库系统中,包括MySQL、PostgreSQL等,在处理布尔类型的字段时,a = TRUE 和 a IS TRUE 的逻辑意义是相同的,它们都会查找字段 a 为真的行。
    但在某些数据库(如SQL Server)中,= 运算符用于比较值的相等性,而 IS 运算符用于判断表达式的真假。对于布尔类型字段:
    a = TRUE:直接检查字段 a 是否等于布尔值TRUE。
    a IS TRUE:判断字段 a 是否为逻辑真。
    在MySQL中,尽管两者在大多数场景下表现相同,但 IS TRUE 更倾向于用来强调对布尔类型的判断,并且在处理NULL值时有明确的区别:
    a = TRUE 对于NULL值会返回NULL(不匹配),因为任何值与NULL进行等于运算都不会得到TRUE。
    a IS TRUE 对于NULL值会返回FALSE,因为NULL不是TRUE。*

    撰写回答
    你尚未登录,登录后可以
    • 和开发者交流问题的细节
    • 关注并接收问题和回答的更新提醒
    • 参与内容的编辑和改进,让解决方法与时俱进
    推荐问题
    宣传栏