假设有一个名为tab01的表,并且它有一个名为col01的varchar类型列。如下所示。
# the first statement
SELECT * FROM tab01 WHERE col01 IN (TRUE);
# the second statement
SELECT * FROM tab01 WHERE col01 IN (FALSE);
# the third statement
SELECT * FROM tab01 WHERE col01 IN ('val01');在MySQL 5.7参考手册中,这三个语句具有bit_expr [NOT] IN (expr [, expr] ...)的形式。根据我的直觉,只要expr被计算为True,行就应该返回。
为什么第一条语句什么也不返回?在我看来,第一个语句SELECT * FROM tab01 WHERE col01 IN (TRUE);应该返回所有记录,第二个语句SELECT * FROM tab01 WHERE col01 IN (FALSE);不应该返回任何记录。我在这个MySQL 5.7参考手册里找不到任何线索。
发布于 2019-10-31 11:06:38
对于MySql,TRUE等于1,FALSE等于0。
因此,第一项声明相当于:
SELECT * FROM tab01 WHERE col01 IN (1);除非列col01包含等于1的值(或者以1开头,然后包含非数字字符),否则不会返回任何内容。
第二项声明相当于:
SELECT * FROM tab01 WHERE col01 IN (0);如果列col01不包含与0、、相等的值,那么它也不会返回任何内容,在本例中,正如文档化的表达式计算中的类型转换中所解释的那样,还有其他因素需要考虑。
假设该列的col01数据类型为varchar,则比较:
col01 IN (0)将执行col01到INTEGER的隐式转换,除非col01的值以数字字符开头,否则此转换的结果将始终是0,因此比较的结果将是TRUE。
因此,您的第二条语句将正常返回所有行。
发布于 2019-10-31 10:59:06
在MySQL中,TRUE计算为1。因此,第一个查询相当于:
SELECT * FROM tab01 WHERE col01 = 1;第二项声明意味着:
SELECT * FROM tab01 WHERE col01 = 0;如果col01不是数字,MySQL将在比较之前进行转换。如果比较的数值是0 (通常是:'a' = 0为真),这可能会导致令人惊讶的结果。
https://stackoverflow.com/questions/58641831
复制相似问题