MySQL中的Where子句
我在MySQL中发现了一些让我非常惊讶的东西。我创建了一个表并将记录插入其中,如下所示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
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
,以便对其进行布尔比较!非常感谢,尤尔根!:)谢谢!明白了!:)