Где магия предложения в 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 2

2 ответа:

В MySQL 0 - это false, а not 0 - это true. Итак

where id например, это как where 1.

Так что Ваши ids Все 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)