Как правильно составить SQL запрос с использованием команды BETWEEN и реализовать его с помощью PDO PHP подготовленными запросам

Питаюсь реализовать фильтр товаров по цене, имеются две переменные которые я использую как минимум и максимум того промежутка цен который нужно извлечь с БД, ниже представляю пример того чего я навоял

$db_act = $connect_db->prepare("SELECT * FROM `table_product` WHERE `price` BETWEEN ? AND ?"); 
$db_act->execute(array($this -> from, $this -> up));                
$array_product = $db_act->fetchAll(PDO::FETCH_ASSOC);

Проблема заключается в том что, запрос работает как то не полностью, если установить минимум 100 рублей, а максимум 100000 рублей, то вернуться соответствующие результаты, однако работает это с определёнными промежутками, например если я изменю минимум и поставлю 30 рублей место 100 то результата не будет вообще никакого, казалось бы, промежуток стал больше, но запрос возвращает 0 строк, я даже не могу понять какого рода это ошибка

Мой вопрос: как правильно реализовать такой SQL запрос, должен быть именно подготовленный запрос

Опишу свою БД, MySQL, в таблице 41 кортеж (знаю это не правильно, ну мне и не нужно правильно, нужно чтобы работало), поле price -> vchar(10), в этом поле только цифры без пробелов и других способов форматирования


Ответы (1 шт):

Автор решения: Мелкий

поле price -> vchar(10)

Ну, само собой разумеется, СУБД и использует операторы сравнения строк. Строка "30" больше строки "100" потому что символ "3" больше символа "1", а остальные символы строки значения уже не имеют, ведь на вопрос '30' >= '100' ответ уже получен после сравнения первого символа.

Исторически символ "3" больше символа "1" потому, что в таблице кодировки ASCII (да и наверное, всех кодировок) обозначение символа 1 предшествует символу 3. Сейчас нагромождения collation весьма ситуацию запутывает, но базовый вопрос сравнения чисел не менялся.

Короче, хватит исторических отступлений: храните числа как числа. Это типы данных int, bigint, numeric в SQL. Ещё float или double в тех задачах, где уместны приблизительные вычисления (ни в коем случае не для денег)

→ Ссылка