MySQL에서는 문자열과 정수(int)를 비교하려고 해도 오류가 발생하지 않습니다. 그 이유는 MySQL이 비교 연산을 수행할 때 암시적 형 변환(Implicit Type Conversion)을 통해 문자열을 자동으로 숫자로 변환하기 때문입니다.
예를 들어 '1John' 같은 문자열은 숫자로 변환될 때 앞부분의 숫자만 인식되어 1로 처리되고, 'John'처럼 숫자로 시작하지 않는 문자열은 0으로 변환됩니다.
1. 테스트용 테이블 생성
먼저 varchar 타입과 int 타입의 컬럼을 가진 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1852
(
Value1 varchar(20),
Value2 int
);
Query OK, 0 rows affected (0.00 sec)2. 샘플 데이터 삽입
insert 명령을 사용해 다양한 형태의 문자열 데이터를 입력합니다.
mysql> insert into DemoTable1852 values('1John',1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1852 values('John',1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1852 values('1',1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1852 values('John1',1);
Query OK, 1 row affected (0.00 sec)3. 저장된 데이터 확인
select 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1852;
실행 결과는 다음과 같습니다.
+--------+--------+ | Value1 | Value2 | +--------+--------+ | 1John | 1 | | John | 1 | | 1 | 1 | | John1 | 1 | +--------+--------+ 4 rows in set (0.00 sec)
4. 문자열과 숫자 비교하기
이제 varchar 컬럼(Value1)과 int 컬럼(Value2)을 직접 비교하는 쿼리를 실행해 보겠습니다. 서로 다른 타입을 비교했음에도 오류 없이 정상적으로 실행됩니다.
mysql> select Value1,Value2, Value1=Value2 as Result from DemoTable1852;
실행 결과는 다음과 같습니다.
+--------+--------+--------+ | Value1 | Value2 | Result | +--------+--------+--------+ | 1John | 1 | 1 | | John | 1 | 0 | | 1 | 1 | 1 | | John1 | 1 | 0 | +--------+--------+--------+ 4 rows in set, 3 warnings (0.00 sec)
결과 분석
- '1John' = 1 → 1(참): 문자열이 숫자로 변환될 때 앞부분의 숫자 '1'만 유효하게 인식되어 1로 변환됩니다.
- 'John' = 1 → 0(거짓): 숫자로 시작하지 않는 문자열은 0으로 변환되므로 1과 일치하지 않습니다.
- '1' = 1 → 1(참): '1'은 그대로 숫자 1로 변환되어 일치합니다.
- 'John1' = 1 → 0(거짓): 숫자가 중간에 있어도 앞부분이 숫자가 아니면 0으로 변환됩니다.
또한 결과 하단에 "3 warnings" 메시지가 표시된 것을 볼 수 있습니다. 이는 문자열을 숫자로 강제 변환하는 과정에서 값이 완전히 변환되지 못했다는 경고이며, 오류(Error)와 달리 쿼리 실행에는 영향을 주지 않습니다.
정리
MySQL은 타입이 다른 값을 비교할 때 엄격한 타입 검사를 수행하지 않고 자동으로 형 변환을 진행합니다. 이러한 유연성은 편리할 수 있지만, 의도치 않은 비교 결과나 성능 저하(인덱스 활용 불가 등)를 유발할 수 있으므로 실무에서는 가능한 한 동일한 타입끼리 비교하는 것이 좋습니다.