查询varchar字段时的奇怪行为

时间:2012-07-27 05:49:40

标签: mysql

当我在寻找系统中的错误时,我遇到了这种奇怪的行为。考虑以下。

我们有一个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

1 个答案:

答案 0 :(得分:1)

检查mysql文档12.2. Type Conversion in Expression Evaluation

  

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

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

因此,我们最好使用始终正确的SQL数据类型。