当我在寻找系统中的错误时,我遇到了这种奇怪的行为。考虑以下。
我们有一个mysql表,其中包含varchar(100)列。请参阅以下sql脚本。
create table user(`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` varchar(100) NOT NULL,`username` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `user_id` (`user_id`)) ENGINE=InnoDB AUTO_INCREMENT=129 DEFAULT CHARSET=latin1;
insert into user(user_id, username) values('20120723145614834', 'user1');
insert into user(user_id, username) values('20120723151128642', 'user1');
当我执行以下查询时,我收到了0个结果。
select * from user where user_id=20120723145614834;
但是当我执行以下操作时,我得到了结果(注意单引号)。
select * from user where user_id='20120723145614834';
这是预期的,因为user_id字段是varchar。奇怪的是,以下两个查询都会产生结果。
select * from user where user_id=20120723151128642;
select * from user where user_id='20120723151128642';
任何人都能解释一下这种奇怪行为的原因。我的MySql版本是5.1.63-0ubuntu0.11.10.1
答案 0 :(得分:1)
检查mysql文档12.2. Type Conversion in Expression Evaluation
使用浮点数的比较(或者是使用浮点数的值) 转换为浮点数)是近似的,因为这样 数字不准确。这可能会导致出现结果 不一致:
mysql> SELECT '18015376320243458' = 18015376320243458;
-> 1
mysql> SELECT '18015376320243459' = 18015376320243459;
-> 0
因此,我们最好使用始终正确的SQL数据类型。