#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 также вы можете выполнить простой запрос типа likeSELECT 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), нам нужно привести эту строку