MySQL变量返回不正确的值

时间:2017-08-13 15:57:04

标签: mysql

问题

我在数据库服务器中有一个存储过程,当该记录不存在时返回值5064803,并且根据构建变量值的查询值应为5064800

我不确定这是FLOAT数据类型的值是一个问题,并且表的记录中的值以双零结尾或者什么但我无法轻易弄清楚

表数据类型与来自设置的传感器的数据类型相匹配,但此传感器的这个特定值实际上从未实际设置为数据类型,并且它通常始终是1-8位INT,没有小数但我为了以防万一,我希望保持数据类型与相关传感器相同。

我已经分解了proc并且我能够轻松地重新创建问题所以我将在下面发布详细信息,以便能够帮助我找出问题和任何解决方法等。

SQL数据

创建表格

delimiter $$

CREATE TABLE `number` (
  `TimeInt` varchar(10) NOT NULL,
  `TimeStr` datetime NOT NULL,
  `IsInitValue` int(11) NOT NULL,
  `Value` float NOT NULL,
  `IQuality` int(11) NOT NULL,
  UNIQUE KEY `uk_Times` (`TimeInt`,`TimeStr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$  

插入数据

INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502618950','2017-08-13 10:09:10',1,5064800,0);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502618796','2017-08-13 10:06:36',0,5064800,3);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502617167','2017-08-13 09:39:27',1,5063310,0);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502613355','2017-08-13 08:35:55',0,5063310,3);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502612814','2017-08-13 08:26:54',1,0,0);
INSERT INTO `Number` (`TimeInt`,`TimeStr`,`IsInitValue`,`Value`,`IQuality`) VALUES ('1502609015','2017-08-13 07:23:35',0,0,3);

SQL查询细分

SET @bStartTime = '2017-08-13 09:24:16';
SET @bEndTime = '2017-08-13 10:06:31';
SET @LastNumber = (SELECT Value FROM Number ORDER BY TimeStr DESC LIMIT 1); 
SET @NowNumber  = (SELECT Value FROM Number WHERE TimeStr BETWEEN @bStartTime AND @bEndTime ORDER BY TimeStr DESC LIMIT 1);

SELECT @NowNumber;
SELECT @LastNumber;

重新创建问题

所以基于上面的 SQL查询细分,一旦所有数据都在表中,然后我在SELECT内的@NowNumber查询中运行查询/或@LastNumber变量,我得到5064800的正确结果。但是,如果我为这两个语句运行整个SET语句以使其设置查询,然后只执行这些变量的SELECT,则会返回5064803的错误结果。

因此,例如,如果我运行SELECT Value FROM Number ORDER BY TimeStr DESC LIMIT 1,则返回正确的值。如果我运行SET @LastNumber = (SELECT Value FROM Number ORDER BY TimeStr DESC LIMIT 1);然后运行SELECT @LastNumber;,则会返回错误的值。

服务器系统规范

这个特别 MySQL服务器 Windows Server 2008 上运行x86版本的5.5.50,内存为144 GB,用于某些快速规范。

问题

  • 我想知道造成这种情况的原因,以及是否有问题的解决方法,无论是否更改列的数据类型,假设当它作为变量而不是仅仅返回时出现问题一个直接的查询结果。

    • 如果需要,我会很乐意披露更多有关环境的技术规格,但我已经包含了我认为对这个问题很重要的内容。也许这是一个版本错误或者有一些显而易见的东西导致我无法轻易看到所以我希望有人可以帮助我解决这个问题,或者解释为什么MySQL存在或者不可能。

1 个答案:

答案 0 :(得分:1)

抱歉,声明只能在MySQL的存储过程中使用。我发现这篇文章可能有所帮助。它解释了MySQL在存储数字时如何舍入并建议使用双精度数。尝试将浮动更改为双打。

MySql FLOAT datatype and problems with more then 7 digit scale