2012-07-27 3 views
0

시스템의 버그를 찾아 낼 때 이상한 동작이 나타났습니다. 다음을 고려하십시오.varchar에 대한 쿼리를 수행 할 때 이상한 동작이 발생했습니다.

우리는 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

답변

1

확인 MySQL의 문서 12.2. Type Conversion in Expression Evaluation

비교입니다 그러한 숫자가 부정확합니다. 이 일관성 표시 결과가 발생할 수 있습니다

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

그래서 우리는 더 나은 SQL 항상 올바른 데이터 형식을 사용합니다.

관련 문제