我在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中的错误还是功能?还要解释为什么会发生这种情况。
提前致谢!
答案 0 :(得分:10)
在MySQL 0
中false
而not 0
是true
。所以
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)