Не нашел в манах MySQL ничего

Discussion in 'Песочница' started by user6334, 17 Mar 2016.

  1. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    Не могу объяснить следующий корректный запрос:
    Code:
    SELECT * FROM `users` WHERE login = 'blablabla' + ''
    Конечно, никакого пользователя blablabla в таблице нет, но запрос возвращает все записи. Что означает этот знак плюс?
     
  2. BabaDook

    BabaDook Well-Known Member

    Joined:
    9 May 2015
    Messages:
    1,063
    Likes Received:
    1,559
    Reputations:
    40
    Пробел
     
  3. Waki

    Waki Member

    Joined:
    9 Oct 2015
    Messages:
    55
    Likes Received:
    31
    Reputations:
    10
    такой запрос эквивалент запросу
    Code:
    SELECT * FROM `users` WHERE login = 0
    + в мускле оператор сложения

    зы. плохо искал кстати, http://dev.mysql.com/doc/refman/5.7/en/numeric-functions.html
     
  4. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    Заменяем + на пробел, получаем:
    Code:
    SELECT * FROM `users` WHERE login = 'blablabla' ''
    На выводе ничего. Значит не пробел.
     
  5. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    Про оператор сложения, это и так понятно )
    Но, как понять login = 0 учитывая, что login имя пользователя, т.е. строчный тип
    И почему запрос
    Code:
    SELECT * FROM `users` WHERE login = 0
    возвращает всю таблицу, тогда как запрос
    Code:
    SELECT * FROM `users` WHERE login = 1
    не возвращает ничего?
     
  6. Waki

    Waki Member

    Joined:
    9 Oct 2015
    Messages:
    55
    Likes Received:
    31
    Reputations:
    10
    поле login преобразуется в integer, а там большинство строк будут равны 0
     
    user6334 likes this.
  7. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    С преобразованиями типов кажется разобрался ) Но так и не понял, почему запрос
    Code:
    SELECT * FROM `users` WHERE login = 'blablabla' + ''
    или
    Code:
    SELECT * FROM `users` WHERE login = 'blablabla' + 'bebebe'
    будет эквивалентен запросу
    Code:
    SELECT * FROM `users` WHERE login = 0
    ?
    Может это из-за того, что знак плюс является арифметическим оператором, значит все, что он складывает приводиться к числовому типу?
     
  8. Alex_gan

    Alex_gan Member

    Joined:
    24 Feb 2016
    Messages:
    92
    Likes Received:
    69
    Reputations:
    4
    Правая часть из за сложения конвертирует оба слагаемых в цифры. Затем левую часть тоже пытается привести к числовому типу. Странно что при этом выдает результат, а не ошибку.
    Оракл на такой же запрос ругается на несоответсвие типов и это логично.
     
  9. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    В Оракл и MYSQL знак плюс используется кроме арифметического сложения еще и для конкатенации строк
     
  10. Alex_gan

    Alex_gan Member

    Joined:
    24 Feb 2016
    Messages:
    92
    Likes Received:
    69
    Reputations:
    4
    На счет мускула не скажу, а вот в Оракле конкатенация строк это ||. Если + когда то и использовался для этого то в каких то совсем уж древнючих версиях.
     
  11. user6334

    user6334 Member

    Joined:
    29 Jun 2015
    Messages:
    296
    Likes Received:
    17
    Reputations:
    12
    Да, можно было использовать оба варианта, или 2 палки или +. Возможно, плюс уже канул в прошлое, я не проверял