Где магия предложения в MySQL
Я нашел кое-что в 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;
Я заметил, что эти запросы не выбрасывают синтаксические ошибки, но" first " select query возвращает результат как
select * from test;
в то время как" второй " не возвращает ни одного. Это означает, что если предложение where содержит столбец " integer", я получаю результирующий набор, в то время как я не получаю никакого if предложение where содержит столбец" varchar ".
Может ли кто-нибудь сказать мне, является ли это ошибкой или функцией в MySQL? Также объясните мне, почему это происходит.
Заранее спасибо!
2 ответа:
В MySQL
0
- этоfalse
, аnot 0
- этоtrue
. Итак
where id
например, это какwhere 1
.Так что Ваши
id
s Всеtrue
и возвращают запись.Но
name
не может быть автоматически преобразовано в числоnot 0
и являетсяfalse
.Кстати, если значение столбца
name
будет начинаться с числа, то оно будет преобразовано в это число и будетtrue
(например,1tom
вернется в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)