0

我在寻找系统中的错误时遇到了这种奇怪的行为。考虑跟随。

我们有一个具有 varchar(100) 列的 mysql 表。请参阅以下 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

4

1 回答 1

1

检查 mysql 文档12.2。表达式求值中的类型转换

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

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

所以我们最好为 SQL 使用始终正确的数据类型。

于 2012-07-27T06:08:09.650 回答