搜索十进制类型字段时搜索结果不稳定

时间:2014-03-21 02:38:30

标签: mysql decimal

MySQL 5.5数据库SQL:

CREATE TABLE `test` (
  `id` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `age` decimal(19,0) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
insert into `test` (`id`,`age`) values(`1`,`1234567890123456789`);
insert into `test` (`id`,`age`) values(`2`,`1234567890123456787`);

当我使用这个SQL时:

select * from test where age=1234567890123456787 ;

一切正常,但是当我使用这个SQL时:

select * from test where age='1234567890123456787' ;

将显示两个重新编码。我不知道当我的代码使用String类型来搜索十进制类型的字段时,当我的代码将其转换为Long时,一切正常。

为什么MySQL无法报告错误或自动投出不合适的类型,我不知道这个设计是为了什么?当我使用Oracle时,这个问题不存在。

1 个答案:

答案 0 :(得分:1)

这只是另一个浮点值问题。

将十进制值与字符串进行比较时,会将它们作为浮点(实际)数字进行比较。

以下是 MySQL document 的解释:

  

使用浮点数的比较(或者是使用浮点数的值)   转换为浮点数)是近似的,因为这样   数字不准确。这可能会导致出现结果   不一致:

mysql> SELECT '18015376320243458' = 18015376320243458;
        -> 1
mysql> SELECT '18015376320243459' = 18015376320243459;
        -> 0
  

可能会发生此类结果,因为值已转换为   浮点数,只有53位精度   受四舍五入的影响:

mysql> SELECT '18015376320243459'+0.0;
        -> 1.8015376320243e+16
  

此外,从字符串到浮点和从   整数到浮点不一定以相同的方式出现。该   整数可以由CPU转换为浮点数,而   字符串在涉及的操作中逐位转换   浮点乘法。

相关问题