mysql автоматически приводит строки к целому числу

Я только что заметил, что если я делаю запрос MySQL, как этот:

SELECT 1 FROM myTable WHERE id = 'asdf'

Затем строка «asdf» приведен к0. It means that I have a record with id 0 это будет соответствовать. Форматid  полеint(8).

Какой лучший способ продолжить:

I need to check (by PHP for example) that my value is numerical only? There is a MySQL way to do that? I must remove my record with id 0? (bad)
 Hituptony11 июн. 2012 г., 18:00
это зависит от того, не возражаете ли вы ловить символы в целочисленном поле. mySQL разрешит это, если вам не важно, что строка не является целым числом, вы можете обрезать входную запись, чтобы она не переполняла ваши буферы.LINK
 Daniel A. White11 июн. 2012 г., 17:55
у меня не будет 0-й записи.
 Henley Chiu16 нояб. 2012 г., 23:40
Пожалуйста, переименуйте название вопроса. Я пришел сюда, чтобы узнать, как преобразовать int в строку, но он даже не ответил. не удобный для пользователя.
 Pekka 웃11 июн. 2012 г., 17:52
Обычный способ действительно состоит в том, чтобы предварительно проверить переменную и посмотреть, является ли она числовой. (Многие примеры кодирования, которые я видел, делают простое(int) бросить, хотя, что также приводит к0)
 Girish Rao11 июн. 2012 г., 17:55
Вы должны всегда проверять входные данные, особенно когда выполняете команды для своей базы данных и тем более, если часть входных данных поступает от внешнего пользователя. Это просто хорошая практика (например, чтобы избежать инъекционных атак). PHP имеет функцию isNumericphp.net/manual/en/function.is-numeric.php

Ответы на вопрос(3)

е вызовут никаких ошибок (кроме случаев, когдастрогий режим mysql включен), ваш единственный выбор - обеспечить и контролировать типы переменных в вашем php, чтобы они были «правильными». вседозволенность этих языков.

[спасибо комментаторам]

 11 июн. 2012 г., 18:14
+1 за использование подготовленных высказываний.
 11 июн. 2012 г., 18:58
В этом случае использование подготовленных операторов не сработает, потому что библиотека будет разыгрывать «asdf». до 0, поэтому он будет возвращать неправильные строки. Точка проверки типа в php совершенно верна.

чтобы они не использовали числовые поля, как если бы они были текстовыми.

Еслиid числовое поле, то вашwhere пункт никогда не может быть полезным. Да, было бы хорошо, если бы MySQL активно жаловался на это, но, по сути, вы не должны писать код, который запускает некорректные запросы для начала.

Как этот запрос попал в вашу систему? Это'asdf' часть прямого пользовательского ввода? Можете ли вы использовать вместо этого параметризованный SQL?

Если вы действительноintending чтобы запросить числовое поле, вы должны убедиться, что ваш ввод сначала числовой. Преобразовать текст в целое число в вашем коде вызова,not в базе данных.

 11 июн. 2012 г., 18:19
@MarkByers: это не означает, что вы должны использовать нецелые числа в запросе для целочисленного ввода. Буду редактировать, чтобы уточнить.
 Yann Sagon12 июн. 2012 г., 11:33
Я не понимаю вашу точку зрения, когда вы говорите, что если id является числовым полем, предложение where никогда не будет полезным
Решение Вопроса

$id = 'asdf';
if(is_numeric($id)){
    $query("SELECT 1 FROM myTable WHERE id = $id");
}else{
    die("ID is not numeric");
}

Или вы можете сделать:

    SELECT 1 FROM myTable WHERE id = 'asdf' AND 'asdf' REGEXP '^-?[0-9]+

Это привело бы к регулярному выражению to = false, в результате чего строки не возвращались.

Это привело бы к регулярному выражению to = false, в результате чего строки не возвращались.

 06 февр. 2019 г., 12:32
Я бы предпочел использоватьis_int($id) вместо этого, потому чтоis_numeric($id) также будет идти с "+ 0123.45e6". Это, конечно, зависит от типа вашей базы данных Integer и ее параметров.
 Yann Sagon12 июн. 2012 г., 12:11
просто еще один метод для проверки int в php:$id = filter_input(INPUT_GET | INPUT_POST, "varName", FILTER_VALIDATE_INT);
 Yann Sagon12 июн. 2012 г., 11:36
спасибо за трюк с регулярным выражением.

Ваш ответ на вопрос