2011-03-02 5 views
0
SELECT COUNT(*) FROM area 
WHERE ROUND(SQRT(POWER(('71' - coords_x), 2) + 
       POWER(('97' - coords_y), 2))) <= 17 

==> 51 

SELECT COUNT(*) FROM area 
WHERE ROUND(SQRT(POWER((71 - coords_x), 2) + 
       POWER((97 - coords_y), 2))) <= 17 

==> 22 

coords_x 및 coords_y는 둘 다 [1, 150] 범위의 값을 포함하는 TINYINT 필드입니다. 보통 MySQL은 숫자가 인용되는지 아닌지는 신경 쓰지 않지만 분명히이 경우에 나온다.선택 쿼리의 계산에 영향을 미치는 작은 따옴표

질문은 단지 이유가 무엇입니까?

+3

또 다른 질문은 다음과 같습니다. 왜 숫자를 문자열처럼 취급하고 싶습니까? – Cosmin

+0

나는 그 이유를 알 수는 없지만 조금 뒤집어 볼 수도있다 ... WHERE 절에서 비교하려고하는 값을 선택하고 두 경우 모두 값이 무엇인지 살펴볼 수있다. –

답변

0

MySQL 항상은 데이터 유형을 고려합니다. 무슨 일이 일어날 지 당신의 코드는 자동 형 캐스팅에 의존하고 문자열 (숫자를 저장할 수있는 지 여부)에 대해 수학을 수행합니다. 이 예측할 수없는 결과가 모든 종류의로 이어질 수 :

SELECT POW('Hello', 'World') -- This returns 1 

요약하면 : 당신은 배우고 MySQL이 제공하는 다른 데이터 유형을 사용해야합니다. 그렇지 않으면 응용 프로그램이 안정적인 계산을 수행하지 못합니다.

업데이트 :

하나 이상의 힌트 :

TINYINT [(M)] [UNSIGNED] [ZEROFILL]

매우 작은 정수. http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html

난 당신이 서명 TINYINT 열에 150를 저장하려고하지 않는 희망 : 서명 된 범위 는 서명되지 않은 범위는 0 URL

255 127 -128입니다.

관련 문제