Почему ВЫБОР «099anystring» = 99 возвращает значение true в Mysql?

#mysql #mariadb

Вопрос:

Вчера я запустил запрос

 UPDATE table SET col='newvalue' WHERE col = 99 
 

где col находится ВАРЧАР

Он обновил строки, такие как «099string» и «99something», что, очевидно, привело к неправильным обновлениям

Я ожидал обновления только там, где col = «99»

Я использую 10.2.40-MariaDB-1:10.2.40 maria~bionic-log

PS: Я знаю, что «099anystring» = «99» будет работать так, как я намереваюсь.

Но это не мой вопрос.

Мой вопрос в том, какова техническая причина того, что «099anystring» = 99 возвращает значение true?

Комментарии:

1. Будет ли работать col = «99»?

2. @DownloadPizza это сработало бы, я не пробовал, но мой вопрос остается прежним, какова техническая причина того, что «099anystring» = 99 возвращает true?

3. Вопросы «почему» редко дают полезные ответы на этом уровне, потому что вы действительно ищете одного из немногих людей, которые присутствовали на совещании по дизайну или что бы они ни использовали, чтобы решить это, чтобы рассказать вам, почему они решили то, что решили. В лучшем случае, как правило, вы получаете документацию, в которой говорится, что это так, но очень редко, почему это было выбрано. Я могу видеть из документации, что это сделано, но в ней не говорится, почему это так: dev.mysql.com/doc/refman/8.0/en/type-conversion.html (найдите «1a»).

4. В этом случае Александр предоставил вам ответ, в котором говорится, почему сравнение дает истину, но теперь я предполагаю, что ваш реальный вопрос заключается в том, почему преобразование этой строки в число на самом деле просто отсекает часть, не содержащую числа, или что-то подобное. Я также предполагаю, что это конкретное «почему» будет труднее найти причину.

Ответ №1:

Когда вы сравниваете целое число со строкой, оно преобразует строку в целое число.

"099anystring" = 99 это то же самое, как если бы вы писали 099 = 99 , что в обоих случаях возвращает true

https://mariadb.com/kb/en/equal/

Комментарии:

1. Я предполагаю, что это просто вызовет последующий вопрос или изменение исходного вопроса здесь , почему преобразование '099anystring' в число дает 99 результат, а не ошибку или не-число или что-то еще.

2. @LasseV.Карлсен должен быть по замыслу, а почему это по замыслу, это выходит за рамки моей компетенции, хех 🙂