我想知道为什么使用DBI在Perl代码中形成的查询没有返回正确的记录。我有简单的查询,如:
my $query = "SELECT id FROM table WHERE title = ? AND price = ?";
我执行了它:
my $sth = $dbh->prepare( $query );
my ($id) = $dbh->selectcol_arrayref( $sth, undef, $title, $price );
大部分时间一切正常,但在极少数情况下我没有得到预期的结果。所以我也试过CLI。带有可疑值的Fulled查询:
SELECT id FROM table WHERE title = 'Some title' AND price = 1.66;
得到了想要的记录。在那之后我也引用了价格值:
SELECT id FROM table WHERE title = 'Some title' AND price = '1.66';
结果得到零记录。
之后我尝试使用其他报价价格,比如'1.67',他们工作正常。
这里有什么问题?为什么这么简单的查询失败为了重现行为,我将简单架构和查询放到sqlfiddle,因为您可能会看到简单查询SELECT * FROM Table1 WHERE price = '1.66' OR price = '1.67';
只给出一个结果。
我觉得,它可能与double数据类型的性质有关(1.66表示为1.66666666 ......?),但是当我在DBI中使用占位符时,我应该如何形成我的查询?
答案 0 :(得分:9)
您永远不应该将浮点数比较为相等。你应该使用公差。使用容差或从浮点数切换(到numeric
中的text
,integer
或美分。)