2014-02-10 3 views
2

Я видел некоторых программистов, использующих это условие 0='"="1' и не знаю, почему он возвращает true? Может ли кто-нибудь объяснить это мне? Спасибо!Почему это условие 0 = '= 1' истинно?

+0

Некоторые программисты? В самом деле? –

+1

Это действительно так. Вопрос в том, кто-то, кто действительно использует это условие, заслуживает WAT? (https://www.destroyallsoftware.com/talks/wat) –

ответ

4

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

При наведении строки на число mysql принимает все ведущие числа и выбрасывает остальное. Когда нет ведущих чисел, строка приводится к нулю:

0 = 'abc' -- true: string cast to 0 
1 = '1abc' -- true: string cast to 1 

Ваша строка оценивается как 0, так как нет ведущих чисел.

+0

Я удаляю свой ответ, потому что ваш значительно лучше. Правда ли, что RHS всегда преобразуется в тип LHS? Значение '' '= 0' соответствует true? – Gray

+1

@Gray упс! ваш пример был хорошим: '' '= 0' истинно, поэтому я изменил свое первое предложение. – Bohemian

+0

О, круто. Спасибо за проверку. Нельзя ли это просто означать, что '0' приписывается' ''', когда это строка? Я не пытался сказать, что вы неверны, просто хотите понять, как он выбирает бросить. Я думал, что есть какой-то порядок приоритета, но вы упомянули, что это имеет отношение к стороне. Я не мог найти ничего, что говорило бы, что вы были неправы. – Gray

1

Проблема не имеет отношения к «необычным» внешним видом строки. Да. это просто примитивное неявное преобразование типов. Вы можете сделать:

 
mysql> select 0='blablabla'; 
+---------------+ 
| 0='blablabla' | 
+---------------+ 
|    1 | 
+---------------+ 
1 row in set, 1 warning (0.00 sec) 

И вижу причину:

 
mysql> show warnings; 
+---------+------+-----------------------------------------------+ 
| Level | Code | Message          | 
+---------+------+-----------------------------------------------+ 
| Warning | 1292 | Truncated incorrect DOUBLE value: 'blablabla' | 
+---------+------+-----------------------------------------------+ 
1 row in set (0.00 sec) 

Так же с '"="1' - это просто строка и будет усечен во время преобразования в DOUBLE вызывая нулевое значение.

Смежные вопросы