MySQL 中的 Where 子句魔术
Where clause magic in MySQL
我在 MySQL 中发现了一些让我非常惊讶的东西。我创建了一个 table 并将记录插入其中,如下所示,
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;
我注意到这些查询不会抛出语法错误,但“first”select 查询 return 的结果是
select * from test;
而“second”则没有 return。这意味着如果 where 子句包含一个“integer”列,我得到一个结果集,而我没有得到任何 if where 子句包含一个“varchar[=28” =]”列。
谁能告诉我这是 MySQL 中的错误还是功能?也解释一下为什么会这样。
提前致谢!
在 MySQL 中 0
是 false
而 not 0
是 true
。所以
where id
例如 where 1
.
所以你的 id
都是 true
和 return 的记录。
但是name
不能自动转换为not 0
数,是false
。
顺便说一句,如果 name
列值以数字开头,那么它将被转换为该数字并成为 true
(例如 1tom
将 return在 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)
我在 MySQL 中发现了一些让我非常惊讶的东西。我创建了一个 table 并将记录插入其中,如下所示,
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;
我注意到这些查询不会抛出语法错误,但“first”select 查询 return 的结果是
select * from test;
而“second”则没有 return。这意味着如果 where 子句包含一个“integer”列,我得到一个结果集,而我没有得到任何 if where 子句包含一个“varchar[=28” =]”列。
谁能告诉我这是 MySQL 中的错误还是功能?也解释一下为什么会这样。
提前致谢!
在 MySQL 中 0
是 false
而 not 0
是 true
。所以
where id
例如 where 1
.
所以你的 id
都是 true
和 return 的记录。
但是name
不能自动转换为not 0
数,是false
。
顺便说一句,如果 name
列值以数字开头,那么它将被转换为该数字并成为 true
(例如 1tom
将 return在 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)