MySQL中的where子句魔术

时间:2015-01-02 07:38:38

标签: mysql where-clause

我在MySQL中找到了一些令我惊讶的东西。我创建了一个表并将记录插入其中,如下所示,

CREATE TABLE `test` (
   `ID` int,
   `NAME` varchar(100)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO test VALUES (1,'a'),(2,'b'),(3,'c');

现在,我对此运行两个SELECT查询,如下所示,

select * from test where id;

select * from test where name;

我注意到这些查询不会抛出语法错误,但“第一个”选择查询会返回结果为 select * from test; 而“第二”一个不返回任何。这意味着如果where子句包含“ integer ”列,我会得到一个结果集,而如果where子句包含“ varchar ”列,则不会得到任何结果集。 / p>

有谁可以告诉我这是MySQL中的错误还是功能?还要解释为什么会发生这种情况。

提前致谢!

2 个答案:

答案 0 :(得分:10)

在MySQL 0falsenot 0true。所以

例如,

where id就像where 1

因此,您的id全部为true并返回记录。

name无法自动转换为not 0号码,且为false

顺便说一句,如果name列值以数字开头,那么它将被转换为该数字并且true(例如1tom将在1中返回)。

答案 1 :(得分:1)

name列已转换为0,因为它们不是numerical format。如果名称为“2”并带有警告,则可以获取它。

mysql> CREATE TABLE test (id INT, name VARCHAR(20));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO test VALUES (0, 'a'), (1, 'b'), (2, '2');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM test WHERE name;
+------+------+
| id   | name |
+------+------+
|    2 | 2    |
+------+------+
1 row in set, 2 warnings (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'a' |
| Warning | 1292 | Truncated incorrect INTEGER value: 'b' |
+---------+------+----------------------------------------+
2 rows in set (0.00 sec)