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时,这个问题不存在。
答案 0 :(得分:1)
这只是另一个浮点值问题。
将十进制值与字符串进行比较时,会将它们作为浮点(实际)数字进行比较。
以下是 MySQL document 的解释:
使用浮点数的比较(或者是使用浮点数的值) 转换为浮点数)是近似的,因为这样 数字不准确。这可能会导致出现结果 不一致:
mysql> SELECT '18015376320243458' = 18015376320243458;
-> 1
mysql> SELECT '18015376320243459' = 18015376320243459;
-> 0
可能会发生此类结果,因为值已转换为 浮点数,只有53位精度 受四舍五入的影响:
mysql> SELECT '18015376320243459'+0.0;
-> 1.8015376320243e+16
此外,从字符串到浮点和从 整数到浮点不一定以相同的方式出现。该 整数可以由CPU转换为浮点数,而 字符串在涉及的操作中逐位转换 浮点乘法。