MySQL에서 intvalue='1'과 intvalue=1의 차이점
MySQL에서 INT 타입 컬럼을 조건으로 조회할 때는 intvalue=1처럼 숫자 리터럴을 사용하는 것이 올바른 방법입니다. 반면 intvalue='1'처럼 문자열을 사용하면 MySQL이 내부적으로 cast('1' as int) 형태로 암시적 형 변환(Implicit Conversion)을 수행합니다.
두 쿼리 모두 결과는 동일하게 보일 수 있지만, 암시적 형 변환이 발생하면 인덱스를 제대로 활용하지 못해 대용량 데이터를 처리할 때 성능 저하가 생길 수 있습니다. 따라서 항상 컬럼 타입에 맞는 리터럴을 사용하는 것이 좋습니다.
1. 예제 테이블 생성
먼저 테스트에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1566
-> (
-> intvalue int
-> );
Query OK, 0 rows affected (0.64 sec)
2. 데이터 삽입
insert 명령어로 여러 개의 레코드를 삽입합니다.
mysql> insert into DemoTable1566 values(1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1566 values(55);
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable1566 values(75);
Query OK, 1 row affected (0.32 sec)
mysql> insert into DemoTable1566 values(90);
Query OK, 1 row affected (0.19 sec)
3. 전체 레코드 조회
select 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1566;
실행 결과는 다음과 같습니다.
+----------+
| intvalue |
+----------+
| 1 |
| 55 |
| 75 |
| 90 |
+----------+
4 rows in set (0.00 sec)
4. intvalue=1로 조회 (권장 방식)
숫자 리터럴을 사용한 조회 쿼리입니다.
mysql> select * from DemoTable1566 where intvalue=1;
실행 결과:
+----------+
| intvalue |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
5. intvalue='1'로 조회
문자열 리터럴을 사용한 조회 쿼리입니다.
mysql> select * from DemoTable1566 where intvalue='1';
실행 결과:
+----------+
| intvalue |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
정리
두 쿼리 모두 동일한 결과를 반환하지만 내부 동작에는 분명한 차이가 있습니다. MySQL은 intvalue='1'처럼 타입이 맞지 않는 값을 비교할 때 자동으로 형 변환을 수행하는데, 이 과정에서 옵티마이저가 인덱스를 효율적으로 사용하지 못할 수 있습니다. 소규모 데이터에서는 차이를 느끼기 어렵지만, 실무 환경에서는 쿼리 성능에 직접적인 영향을 줄 수 있으므로 컬럼 타입에 맞는 값(intvalue=1)을 사용하는 습관을 들이는 것이 바람직합니다.