Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Песочница (https://forum.antichat.xyz/forumdisplay.php?f=189)
-   -   Не нашел в манах MySQL ничего (https://forum.antichat.xyz/showthread.php?t=438669)

user6334 17.03.2016 11:07

Не могу объяснить следующий корректный запрос:

Код:

SELECT * FROM `users` WHERE login = 'blablabla' + ''
Конечно, никакого пользователя blablabla в таблице нет, но запрос возвращает все записи. Что означает этот знак плюс?

BabaDook 17.03.2016 13:07

Цитата:

Сообщение от user6334

Не могу объяснить следующий корректный запрос:
Код:

SELECT * FROM `users` WHERE login = 'blablabla' + ''
Конечно, никакого пользователя blablabla в таблице нет, но запрос возвращает все записи. Что означает этот знак плюс?

Пробел

Waki 17.03.2016 13:14

Цитата:

Сообщение от user6334

Не могу объяснить следующий корректный запрос:
Код:

SELECT * FROM `users` WHERE login = 'blablabla' + ''
Конечно, никакого пользователя blablabla в таблице нет, но запрос возвращает все записи. Что означает этот знак плюс?

такой запрос эквивалент запросу

Код:

SELECT * FROM `users` WHERE login = 0
+ в мускле оператор сложения

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

user6334 17.03.2016 13:49

Цитата:

Сообщение от BabaDook

Пробел

Заменяем + на пробел, получаем:

Код:

SELECT * FROM `users` WHERE login = 'blablabla' ''
На выводе ничего. Значит не пробел.

user6334 17.03.2016 13:57

Цитата:

Сообщение от Waki

такой запрос эквивалент запросу
Код:

SELECT * FROM `users` WHERE login = 0
+ в мускле оператор сложения
зы. плохо искал кстати,
http://dev.mysql.com/doc/refman/5.7/...functions.html

Про оператор сложения, это и так понятно )

Но, как понять login = 0 учитывая, что login имя пользователя, т.е. строчный тип

И почему запрос

Код:

SELECT * FROM `users` WHERE login = 0
возвращает всю таблицу, тогда как запрос

Код:

SELECT * FROM `users` WHERE login = 1
не возвращает ничего?

Waki 17.03.2016 14:05

Цитата:

Сообщение от user6334

Про оператор сложения, это и так понятно )
Но, как понять login = 0 учитывая, что login имя пользователя, т.е. строчный тип

поле login преобразуется в integer, а там большинство строк будут равны 0

user6334 17.03.2016 14:29

Цитата:

Сообщение от Waki

поле login преобразуется в integer, а там большинство строк будут равны 0

С преобразованиями типов кажется разобрался ) Но так и не понял, почему запрос

Код:

SELECT * FROM `users` WHERE login = 'blablabla' + ''
или

Код:

SELECT * FROM `users` WHERE login = 'blablabla' + 'bebebe'
будет эквивалентен запросу

Код:

SELECT * FROM `users` WHERE login = 0
?

Может это из-за того, что знак плюс является арифметическим оператором, значит все, что он складывает приводиться к числовому типу?

Alex_gan 17.03.2016 15:33

Правая часть из за сложения конвертирует оба слагаемых в цифры. Затем левую часть тоже пытается привести к числовому типу. Странно что при этом выдает результат, а не ошибку.

Оракл на такой же запрос ругается на несоответсвие типов и это логично.

user6334 17.03.2016 16:05

Цитата:

Сообщение от Alex_gan

Правая часть из за сложения конвертирует оба слагаемых в цифры. Затем левую часть тоже пытается привести к числовому типу. Странно что при этом выдает результат, а не ошибку.
Оракл на такой же запрос ругается на несоответсвие типов и это логично.

В Оракл и MYSQL знак плюс используется кроме арифметического сложения еще и для конкатенации строк

Alex_gan 17.03.2016 16:20

На счет мускула не скажу, а вот в Оракле конкатенация строк это ||. Если + когда то и использовался для этого то в каких то совсем уж древнючих версиях.


Время: 22:49