2012-02-15 2 views
0

Я использую код снипета ниже, чтобы искать диапазоны цен. Если я ищу 1-600 долларов как низко-высокий, результаты включают цены, такие как 22 500. Столбец - varchar. БлагодаряНизкие цены и высокий поиск

if (($price_low) && ($price_high)){ 
$statement .= " OR item_price BETWEEN ? AND ? "; 
push(@binds,$price_low,$price_high); 
} 
elsif (($price_low) && ($price_high eq "")){ 
$statement .= " OR item_price > ? "; 
push(@binds,$price_low); 
} 
elsif (($price_high) && ($price_low eq "")){ 
$statement .= " OR item_price BETWEEN ? AND ? "; 
push(@binds,1,$price_high); 
} 
else { } 
my $sth = $dbh->prepare(qq(SELECT * FROM ads WHERE $statement)) or die $DBI::errstr; 
$sth->execute(@binds); 
+4

Если в вашей базе данных цена представляет собой доллары, зачем использовать varchar вместо численного типа данных? – hexparrot

+0

Значения в столбце 'item_price' в базе данных - это номера, которые были отформатированы как строки, включая разделители запятой? Этот тип форматирования обычно выполняется во время вывода, а не перед хранением в БД. –

+0

Можете ли вы действительно использовать 'BETWEEN' и'> 'для столбца varchar без явного ввода данных в виде числа? – TLP

ответ

3

Вы пишете:

The column is varchar.

Это и ваше форматирование в столбце, проблема здесь. Для строки вы упоминаете, вы, по сути это сделать:

> SELECT '22,500' BETWEEN 1 AND 600; 

MySQL будет принудительно конвертировать '22,500' снабжать струной, тетивой и т.п. с числовым значением, отрубив все после того, как (и включая) первую запятую. Таким образом, item_price из '22,500' становится 22, что, конечно, МЕЖДУ 1 И 600. (Что произойдет, если вы ПОКАЖИТЕ ПРЕДУПРЕЖДЕНИЯ после выполнения вашего заявления? Я думаю, вы увидите предупреждение о некорректном усечении DOUBLE ...)

Преобразуйте колонку в нужный цифровой тип и повторите запрос. (Исправление проблемы @CanSpice указано ...)

+0

umm..и попробовал TINYINT, SMALLINT, MEDIUMINT, BIGINT, INT и DECIMAL из числовых вариантов, и никто не будет работать. Может кто-то порекомендовать правильный выбор? –

+0

@ta: Покажите нам, что именно не работает, и точно, как воспроизвести сбой. – pilcrow

+0

После изменения столбца в INT в mysql admin, а затем измените цену на 22 500 в mysql admin. Я получаю эту ошибку: 0 строк затронуты. Предупреждение: # 1265 Данные усечены для столбца 'item_price' в строке 1 –

Смежные вопросы