2011-10-12 258 views
0

enter image description here我有一个MySQL表,其中一个字段是variation和类型是float。它的值是0.2。但是,当我查询如WHERE variation = '0.2'它没有显示结果,而是它返回null。我做错了什么?SQL字段类型字段没有显示

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

什么口味SQL的? –

+0

@pekka我正在使用MySQL – Nitish

+0

你的表是否有满足你的整个'WHERE'子句的行?请向我们展示您期待的行。 –

回答

3

删除数字后面的引号再试一次。

WHERE variation = 0.2

编辑:Peeka指出,引号不要在MySQL的关系。

您是否确定float的值恰好为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你得到你想要的结果?

+0

The引用不应该是一个问题,至少不是如果使用的数据库是mysql。 –

+0

@mwan我试过但结果相同! – Nitish

+0

@Nitish:你可以发布你的整个查询吗?你确定你的区域设置使用小数点不是一个例子)? – mwan

0

试试; TO_CHAR(变化)= '0.2'

请检查该链接,很可能这将帮助:

Selecting a float in MySQL

+0

他使用mySQL –

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