Mysql 查询varchar字段时的奇怪行为

Mysql 查询varchar字段时的奇怪行为,mysql,Mysql,我在寻找系统中的bug时遇到了这种奇怪的行为。考虑以下问题:p> 我们有一个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`)

我在寻找系统中的bug时遇到了这种奇怪的行为。考虑以下问题:p> 我们有一个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;
但当我执行以下命令时,我得到了结果(请注意单引号)

这是预期的,因为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

检查MySql文档

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

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

select * from user where user_id=20120723151128642;
select * from user where user_id='20120723151128642';
mysql> SELECT '18015376320243458' = 18015376320243458;
        -> 1
mysql> SELECT '18015376320243459' = 18015376320243459;
        -> 0