MySQL中的Where子句

MySQL中的Where子句,mysql,where-clause,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 * from test where id; select * from test where nam

我在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 * from test where id;

select * from test where name;
现在,我对此运行两个SELECT查询,如下所示

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

INSERT INTO test VALUES (1,'a'),(2,'b'),(3,'c');
select * from test where id;

select * from test where name;
我注意到这些查询不会抛出语法错误,但是“first”select查询返回结果为
从测试中选择*
而“秒”“秒”不会返回任何值。这意味着,如果where子句包含一个“integer”列,我会得到一个结果集,而如果where子句包含一个“varchar”列,我不会得到任何结果集

有人能告诉我这是MySQL中的一个bug还是一个特性吗?还要解释一下为什么会发生这种情况


提前谢谢

在MySQL中
0
false
不是0
true
。所以

例如,
whereid
类似于
where1

因此,您的
id
s都是
true
,并返回记录

但是
名称
不能自动转换为
非0
数字,并且是


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

name
列被转换为
0
,因为它们不是
数字格式。如果名称为带有警告的“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)

你想要什么?您的意思是
从测试中选择id
?嗨,为什么varchar列不会发生这种情况?因为不以数字开头的字符串将转换为数字
0
,以便对其进行布尔比较!非常感谢,尤尔根!:)谢谢!明白了!:)