Почему 3 строки удалили загадку SQL? - PullRequest
2 голосов
/ 28 сентября 2011

Кто-нибудь может сказать мне техническую причину этого?

CREATE TABLE test (
  id varchar(3) NOT NULL,
  PRIMARY KEY  (id)
);

INSERT INTO test VALUES ('0'), ('1'), ('2'), ('ab'), ('bb');

select * from test;

DELETE FROM test WHERE id=0;

Which Deletes 3 rows from table test.

Ответы [ 5 ]

6 голосов
/ 28 сентября 2011

Потому что это:

SELECT 0 = 'ab';
+----------+
| 0 = 'ab' |
+----------+
|        1 |
+----------+

Чтобы удалить точные строки, используйте оператор BINARY, он заставит байтовое сравнение -

DELETE FROM test WHERE id = BINARY 0;
5 голосов
/ 28 сентября 2011

Когда вы сравниваете числа со строками, они сравниваются как числа с плавающей запятой.Любая строка, которая НЕ начинается с цифры, неявно преобразуется в число 0.

0 голосов
/ 14 октября 2011

Хорошо, сначала я запутался, когда увидел это, но теперь у меня это получилось, когда вы работаете

select * from test;

DELETE FROM test WHERE id=0;

Этот запрос сравнивает каждую строку как целое число, а не как строку, поэтому, когда MySQL приходит к ab & bbпоэтому MySQL принимает его за 0 и удаляет его, если вы начинаете его с любой цифры, например 1ab, поэтому MySQL принимает 1ab за 1, а когда вы запускаете запрос на удаление 1 вместо 0, он удаляет 1ab

Try

select * from test;

DELETE FROM test WHERE id='0';

Этот код сравнивает строки как строку, поэтому, когда он получает точный '0', MySQL удаляет его, иначе ничего.

0 голосов
/ 28 сентября 2011

Попробуйте вместо этого сравнить значения одного типа, например,

DELETE FROM test WHERE id = CAST(0 AS VARCHAR(3));
0 голосов
/ 28 сентября 2011

Существует разница между символом '0' и целым числом 0 .. Когда вы сравниваете Char с целым числом, строка Char, если не целое, возвращает ложное значение (i, e) A 0, следовательно, делает условие истинным и удаляетПервая, 4-я и 5-я строки из вашей таблицы ... Чтобы удалить конкретную строку, необходимо проверить условие следующим образом ...

Удалить из теста, где id = '0';(A Char 0, не An Integer 0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...