为什么'1.66'在双字段中与MySQL中的1.66不匹配?

w.k*_*w.k 4 mysql perl dbi

我想知道,为什么我在使用DBI的Perl代码中形成的查询没有返回正确的记录.我有简单的查询,如:

my $query = "SELECT id FROM table WHERE title = ? AND price = ?";
Run Code Online (Sandbox Code Playgroud)

我执行它像:

my $sth = $dbh->prepare( $query );
my ($id) = $dbh->selectcol_arrayref( $sth, undef, $title, $price );
Run Code Online (Sandbox Code Playgroud)

大部分时间一切正常,但在一些罕见的情况下,我没有得到我预期的结果.所以我也试过CLI.带有可疑值的Fulled查询:

SELECT id FROM table WHERE title = 'Some title' AND price = 1.66;
Run Code Online (Sandbox Code Playgroud)

并得到了想要的记录.之后我也引用了价格值:

SELECT id FROM table WHERE title = 'Some title' AND price = '1.66';
Run Code Online (Sandbox Code Playgroud)

结果得到记录.

之后我尝试了其他报价价格,比如'1.67',他们工作得很好.

这有什么问题?为什么这么简单的查询失败 为了重现行为,我将简单的模式和查询放到sqlfiddle,因为您可能会看到简单查询SELECT * FROM Table1 WHERE price = '1.66' OR price = '1.67';只给出一个结果.

我觉得,它可能与double数据类型的性质有关(1.66表示为1.66666666 ......?),但是当我在DBI中使用占位符时,我应该如何形成我的查询?

ike*_*ami 9

您永远不应该将浮点数比较为相等.你应该使用公差.既可以使用从浮点数(对耐受性或交换numeric,text或美分的integer).