
我有一个MySQL表,其中一个字段是variation,类型是float。它的值是0.2。但是当我像WHERE variation = '0.2'这样查询时,它不会显示结果,而是返回null。我做错了什么?
SELECT * FROM tbl_products
WHERE frequency BETWEEN '2' AND '3'
AND gain = '2'
AND gain_variation = '0.2'
AND noise = '2'
AND power = '10'发布于 2011-10-12 14:43:04
请删除数字两边的引号,然后重试。
例如WHERE variation = 0.2
编辑:正如Peeka指出的那样,引用在MySQL中无关紧要。
您是否绝对确定浮点数的值恰好是0.2,并且没有四舍五入的有效数字?您是否可以尝试使用BETWEEN 0.19 AND 0.21并查看是否返回了您想要的行(我知道这不是一个等价的查询,可能会返回不想要的结果,但它将测试值是否恰好是0.2,或者是否在客户端进行了四舍五入)。
编辑2:我打赌这是因为MySQL存储浮点的方式-取自他们的手册:
浮点数有时会引起混淆,因为它们是近似值,并不存储为精确值。SQL语句中写入的浮点值可能与内部表示的值不同。
有关更多信息,请查看此处:http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html
建议使用范围而不是等式来过滤,所以如果你使用BETWEEN 0.19 AND 0.21,你能得到你想要的结果吗?
发布于 2011-10-12 15:18:46
根据对@mwan答案的讨论,请考虑对此字段使用INT而非FLOAT。当您对一行执行INSERT操作时,您可以将其乘以10的某个幂(取决于所需的精度级别),而当您执行SELECT操作时,您可以将其除以相同的10次方,但是由于字段是一个INT,因此您可以始终确信您的WHERE子句将匹配正确的行:
CREATE TABLE `tbl_products` (
frequency INT,
gain INT,
gain_variation_x100 INT, # give it a name that will remind you
noise INT,
power INT
);
INSERT INTO `tbl_products` VALUES
('1', '2', '0.2' * 100, '2', '10'),
('2', '2', '0.2' * 100, '2', '10'),
('2', '2', '0.5' * 100, '2', '10')
# ↑
# `---- multiply here
;
SELECT *, ROUND(gain_variation_x100 / 100, 1) AS gain_variation
FROM tbl_products # ^---. ^---- show 1 digit of precision
WHERE frequency BETWEEN '2' AND '3' # \
AND gain = '2' # `----- divide here
AND gain_variation_x100 = ROUND('0.2' * 100)
AND noise = '2' # ^----- multiply here
AND power = '10'
;你可以在这里看到它的工作原理:http://sqlize.com/829275n1Fc
发布于 2011-10-12 15:11:17
这就解释了
http://dev.mysql.com/doc/refman/5.0/en/precision-math-examples.html
https://stackoverflow.com/questions/7736207
复制相似问题