2010-12-07 4 views
1

MySQL 버전 5.0.67MySQL 버그? Select the WHERE id = '1blah'

이 매우 간단한 테이블을보고 MySQL 버그를 찾았는지, 내가 대답을 찾으려고했지만 당신이 상상할 수있는 것처럼 말하라. 그렇게이

수행,

CREATE TABLE `product` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(60) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `product` VALUES (1, 'jim'); 
INSERT INTO `product` VALUES (2, 'bob'); 

거기에서 그때 분명히 이것은 다음 행을 반환하지만 다음

SELECT * FROM `product` WHERE `id` = '1'; 

를 선택할 수있는 권리 검색어와 함께 와서 조금 어렵습니다

SELECT * FROM `product` WHERE `id` = '1blah'; 

음 ... 왜? 확실히 이것이 잘못 되었나요? 아니면 화가 나나요? MySQL에 버그 리포트를 보내기 전에 웹 크롤링을 조금 더 할 것입니다.

답변

1

이것은 형식 변환 때문에 발생합니다. 열에 정수 값이 있으므로 '1blah'가 1로 변환됩니다. 자세한 내용은 http://dev.mysql.com/doc/refman/5.0/en/type-conversion.html을 참조하십시오.

+0

아, 이제는 어떻게 멈추는 지 알아 내고, 나는 이것을 원하지 않는다. 나는 BINARY()가 그럴 수 있다고 생각한다. – Catharsis

+1

@ 카타르시스 - BINARY가 아닌 것이다. 상관없이 쿼리 자체가 아니라 SQL 쿼리 생성 코드에서이 문제를 해결해야합니다. –

+2

@Catharsis :'CAST (id as TEXT) '를 사용할 수는 있지만 질의에서'id'에 색인을 사용할 수있는 능력을 잃을 것입니다. –

5

자동으로 "1blah"문자열을 정수로 변환합니다. 문자열이 "1"로 시작하므로 결과 정수는 간단히 1입니다.

이와 같이 간단하지 않은 것처럼 보일 수도 있습니다.

0

정수 ID를 따옴표로 묶지 않은 경우, 을 사용하면 원하는대로 오류가 발생합니다. 즉, 동안

SELECT * FROM `product` WHERE `id` = 1blah; 

ERROR 1054 (42S22): Unknown column '1blah' in 'where clause' 

오류

SELECT * FROM `product` WHERE `id` = 1; 

1 row in set 

작품이다.

+0

사실, 문자열 만 인용되도록 PHP 클래스에 넣어야 할 수도 있습니다. – Catharsis

+0

@Catharsis - 이것이 커스텀 PHP 클래스에서오고 있다면, * all * 변수에 mysql_real_escape_string을 사용해야합니다. –

+0

예, 이미 경고했지만 경고를 주셔서 감사합니다. – Catharsis