2016-07-05 5 views
2

이 :MYSQL의 비교 유형이 오류를 발생시키지 않는 이유는 무엇입니까?

SELECT * FROM table WHERE comlumn1 = column2; 

결과를 반환합니다.

이 :

SELECT * FROM table WHERE column1 != column2; 

는 모두 요청을 충족 열 세포가있다하더라도, 아무 것도 반환하지 않습니다.

column1이 varchar이고 column2가 int 인 것으로 밝혀졌습니다.

내 질문에 왜 오류가 없었습니까? 왜 한 사람은 결과가 아닌 다른 사람을 돌려 주겠습니까? 유형이 다른 경우 확실하게 항상 동일하지 않습니다.

UPDATE :

column1에서이 1234-34 같은 varchars이었고 column21234 같은 ints했다. 이것은 varchar1234-341234으로 바꾸기 때문에 항상 일치한다는 것을 의미했습니다.

+3

http://stackoverflow.com/questions/4147215/how-int-database-field-gets-compared-to-varchar-type – MusicLovingIndianGirl

+1

@MusicLovingIndianGirl 감사합니다. 그 비슷한,하지만 대답 전에 나는 그런 질문을 찾는 것으로 알려지지 않았을 것입니다. 나는 사람들이이 질문을 추구하지 않을 것이라고 주장 할 것이다. 또한 내 질문은 _why_ 유형이 비교되지 않는 오류가 없다는 것입니다. 나는 그것이 다른 질문이라고 생각한다. – Adzz

답변

1

문자열을 숫자와 비교할 때, MySQL은 문자열을 숫자로 변환하여 비교를 시도합니다.

가능한 경우 문자열의 숫자 결과는 0입니다.

예 :

string value | int value | comparison result 
'abc'   | 1   | 0 = 1 -> false 
'1'   | 1   | 1 = 1 -> true 
'1abc'  | 1   | 1 = 1 -> true 
'abc1'  | 1   | 0 = 1 -> false 
1

MySQL에서 문자열과 정수를 비교하면 MySQL은 문자열을 정수로 변환합니다. 구체적인 규칙은 documentation에 설명되어 있습니다. 귀하의 경우, 이들은 부동 소수점 숫자로 비교됩니다.

정수를 부동 소수점 숫자로 쉽게 변환 할 수 있습니다. 변환 된 문자열은 암시 적 변환을 사용합니다. 문자열에서 발생한 첫 번째 숫자가 변환됩니다. 값이 없으면 값은 0입니다. 따라서 '12.3abc'12.3이됩니다. 'abc'0이됩니다.

아마도 이것은 비교가 실패하는 이유 일 것입니다. 그러나 =은 실패하지만 <>은 성공할 것으로 예상됩니다.

+0

대단히 감사합니다. 그러나 @juergen d가 먼저 도착했습니다. – Adzz

관련 문제