В mysql где предложение bigint показывает неожиданный результат

#mysql

#mysql

Вопрос:

Надеюсь, у вас у всех все хорошо.

Сегодня утром я писал какой-то sql-запрос, и я обнаружил ситуацию, когда мне нужно ваше предложение по этому поводу, так что вот ситуация:

У меня есть таблица в mysql под названием users it has id column, которая bigint сейчас, когда я пытаюсь извлечь данные с помощью запроса типа :

select * from users where id = 123
в этом случае он покажет результат для пользователя 123

теперь ситуация здесь такова, что если я выполняю тот же запрос, например:
select * from users where id = 123b
теперь проблема в том, что он все еще предоставляет мне данные для пользователя 123

нужны ваши предложения, ребята, по тому же вопросу, я провел некоторые исследования и разработки по тому же вопросу, но не нашел ничего полезного.
Спасибо

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

1. Каким бы вы ожидали результат? Если id это int, то, конечно, нет реального пользователя с идентификатором «123b»

2. теперь ситуация здесь такова, что если я выполняю тот же запрос, например: select * from users where id = 123b теперь проблема в том, что он по-прежнему выдает мне данные для пользователя 123 , я вам не верю. Вы должны получить сообщение об ошибке «Неизвестное имя столбца ‘123b'».

3. Я думаю, что OP использует какой-то подготовленный оператор (обратите внимание на mysqli тег?), Поэтому отправляемый необработанный SQL-запрос выглядит примерно так select * from users where id = '123b'

4. Проблема здесь возникает потому, что, когда mysql сравнивает строку с int, mysql преобразует строку в int ( 123b преобразуется в int становится 123 ), см. Пример здесь: gist.github.com/brianr/4208061 также вы можете выполнить простой запрос типа like SELECT 123 = '123b' , и результат будет 1 (который есть true )

5. @Mureinik должно быть 0, если я добавлю count(*), потому что нет пользователя с идентификатором 123b

Ответ №1:

Ваш вопрос помечен mysqli, что означает, что вы используете PHP для построения своего запроса. Если вы передаете строку 123b как целое число, PHP сохранит начальные цифры:

 var_dump((int)'123b');
# output: int(123)
 

Затем MySQL выполняет ваш запрос с этим правильно сформированным целым 123 числом.

Если вы выполняете необработанный SQL-запрос с использованием любого инструмента по вашему выбору, вы должны получить ошибку, подобную следующей:

Неизвестный столбец ‘123b’ в предложении ‘where’

Это 123b связано с тем, что не может быть целым числом, поскольку оно содержит букву, и не является строкой, поскольку в нем нет разделителей строк.

Обратите внимание, что MySQL все еще может интерпретировать строки без разделителей, такие как шестнадцатеричные значения. Например, 0x31323362 является допустимым строковым значением для 123b и не нуждается в кавычках вокруг него.

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

1. да, я пробовал это раньше (int), нам нужно привести эту строку