2012-02-15 4 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'カラムの値は、コンマ区切り文字を含めて文字列としてフォーマットされた数字ですか?このタイプの書式設定は、通常、DBに格納する前ではなく、出力時に実行されます。 –

+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です。(ステートメントを実行した後にSHOW WARNINGSを実行した場合、DOUBLEの不正な切り捨てについての警告が表示されます...)

列を真正な数値型に変換し、再度クエリを実行してください。 (問題の修正@CanSpiceが指摘した...)

+0

umm..i数字の選択肢からTINYINT、SMALLINT、MEDIUMINT、BIGINT、INT、DECIMALを試してみましたが、うまくいきません。誰かが正しい選択を推奨できますか? –

+0

@ta:動作しないものと、エラーを再現する方法を正確に教えてください。 – pilcrow

+0

mysql adminで列をINTに変更した後、mysql adminで価格を22,500に変更しました。このエラーが発生しました:0 rows affected。 警告:#1265行1の 'item_price'列のデータが切り捨てられました –

関連する問題