2012-12-14 3 views
1

WHERE 절이있는 테이블에서 SELECT을 수행 할 때 이상한 동작이 발생하면 정확히 일치하지 않는 레코드가 반환됩니다.정확히 일치하지 않는 부분을 반환하는 mysql select

내 테이블에 기본 키로 id int(11) 열이 있습니다. 예를 들어, 다음 두 쿼리를 ID 5350로 기록을 찾아 모두 ID로 레코드를 반환 내가 가진

SELECT * FROM mytable WHERE id="5350" 
SELECT * FROM mytable WHERE id="5350abcd" 

하나의 생각이 ""주변에 5350을 제거하는 것이었다 5350.

하지만 난 같은 결과를 얻을 수 있습니다 .

$where = "id=$my_id"; 
$this->db->where($where); 

이유 비 정확한 ID가 기록을 찾을 수없는되어 이런 일이, 그리고 내가 그것을 해결 어떻게 있도록 : CodeIgniter를, 나는이 시도?

+0

귀하의 질문이 무엇인지는 분명하지 않습니다. 그러나 열은 정수로 정의되어 있으므로 문자열 값은 정수로 강제 변환됩니다. 왜 두 쿼리가 같은 결과를 얻는 지 궁금하다면 - MySQL은이 두 쿼리를 int로 처리하고 두 쿼리 모두에서 5350을 가져 오기 때문입니다. –

답변

1

두 번째 쿼리에서 ID 값은 정수가 아닙니다. 쿼리를 실행하기 전에 값이 정수인지 확인해야합니다. 그렇지 않으면 값을 캐스팅 할 것입니다.

+0

귀하의 답변에 모두 감사드립니다. 관련 : [링크] (http://stackoverflow.com/questions/10983499/mysql-automaticaly-cast-strings-to-integer) 해결책은 if (! is_int ($ my_id))를 사용하여 int를 확인하는 것입니다. .}'너! – split19

1

필드가 Int 인 것처럼 숫자로 해석됩니다. 만약 당신이 단지 = "abcd"라고 쓰면 0으로 갈 것입니다.

오, 당신이 시도 int 값

0

에 대한 따옴표를 필요가 없습니다

$where = array('id' => $my_id); 
$this->db->where($where); 
0
$where = "id=".((string)(int)$my_id === $my_id ? $my_id : 0); 
$this->db->where($where); 

하지만 당신은 아무것도 쿼리를 만들로이 솔루션은 여전히 ​​추악한이다. 검색어를 작성하기 전에 $my_id이 올바른지 확인해야합니다.

1

내 생각에 글자는 int 유형이기 때문에 글자를 구문 분석합니다. 그것은 알파 인 모든 것을 무시합니다. 숫자가 추가 된 동일한 ID를 가지고 있기 때문에 글자 앞의 숫자로 해석됩니다.

5350 <-- INT 
5350abcd <--- 'abcd' gets parsed out because it's not of INT type. 
You end up with 5350 without the abcd at the end. 

필드가 데이터 유형이 varchar 인 경우 모든 구문을 분석했을 것입니다.

관련 문제