Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 문자열과 숫자를 비교해도 오류가 발생하지 않는 이유

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은 타입이 다른 값을 비교할 때 엄격한 타입 검사를 수행하지 않고 자동으로 형 변환을 진행합니다. 이러한 유연성은 편리할 수 있지만, 의도치 않은 비교 결과나 성능 저하(인덱스 활용 불가 등)를 유발할 수 있으므로 실무에서는 가능한 한 동일한 타입끼리 비교하는 것이 좋습니다.