我有一个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'
答案 0 :(得分:3)
再次删除号码周围的引号。
例如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
,你会得到你想要的结果吗?
答案 1 :(得分:1)
根据有关@ 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
答案 2 :(得分:0)
答案 3 :(得分:0)