1

Писал sql запрос, нашёл ошибку в результатах.

Когда стал детально изучать, увидел косяк в case ... when .... До этого работал с Oracle, он бы такое не пропустил, а MySQL, видимо, кушает всё, что ему дают.

Вопрос - почему выражение select 'A' = 0 возвращает истину? MySQL видит в символе A 0-ю букву алфавита?

upd: посмотрел - любое выражение вида select 'some text' = 0 возвращает истину. MySQL как-то преобразует строку в число?

Denis
  • 8,910
  • 11
  • 31
  • 55
  • Может что то перепутали? select 'A' = 0 или where 'A' = 0 – Raz Galstyan Jun 07 '17 at 08:51
  • @RazmikGalstyan ничего не перепутал, именно select 'A' = 0 для упрощения. – Denis Jun 07 '17 at 08:52
  • Ну тогда это правильно ведь select 'A' = 0 значит не сравнение а присваивание – Raz Galstyan Jun 07 '17 at 08:54
  • И он возвращает истину потому что смог сделать операцию. – Raz Galstyan Jun 07 '17 at 08:54
  • скажите если я что то перепутал – Raz Galstyan Jun 07 '17 at 08:55
  • @RazmikGalstyan нет, этот запрос выдаст 1 - если уравнение верно и 0 - если неверно. Здесь не может быть никакого присваивания – Denis Jun 07 '17 at 08:57
  • можете дать не кусок а целый запрос? – Raz Galstyan Jun 07 '17 at 08:59
  • С точки зрения MySQL все логично. Он всегда переводит строку в число и ошибок, если она не число давать не умеет. Если бы строка начиналась с цифр то результатом было бы это число. А т.к. цифр нет - то результат 0. ну и сравнение уже отрабатывает штатно 0=0 дает истину – Mike Jun 07 '17 at 09:02
  • @RazmikGalstyan это и есть целый запрос. – Denis Jun 07 '17 at 09:19
  • @Mike непривычны после Oracle такие нюансы. – Denis Jun 07 '17 at 09:19
  • 1
    https://ru.stackoverflow.com/questions/579208/%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83-65-65ae3ee2-aeb2-427f-8381-56db91b94363-true/579213#579213 – Mike Jun 07 '17 at 09:44
  • @Mike даже так, интересно. – Denis Jun 07 '17 at 09:58

1 Answers1

1

Как я понял это неявное преобразование типов. Вот примеры сравнивания чисел со строками в mysql.

Равно:
mysql> SELECT 1 = 0;
    -> 0
mysql> SELECT '0' = 0;
    -> 1
mysql> SELECT '0.0' = 0;
    -> 1
mysql> SELECT '0.01' = 0;
    -> 0
mysql> SELECT '.01' = 0.01;
    -> 1
Raz Galstyan
  • 8,258
  • но тут именно сравнение строк из символов без цифр с числами – Denis Jun 07 '17 at 09:59
  • @Denis Это пример сравнения разных типов данных, и я дал в ответе ссылку на подробное описание. – Raz Galstyan Jun 07 '17 at 10:08