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

MySQL WHERE 절에서 문자열을 정수로 자동 변환(Casting)해 특정 ID 조회하기

MySQL의 암시적 타입 변환 동작 이해하기

MySQL에서는 WHERE 절에서 숫자와 문자열을 비교할 때 암시적(Implicit) 타입 변환이 발생합니다. 중요한 규칙은 다음과 같습니다.

문자열이 정수로 시작하면 해당 부분만 정수로 변환되고, 그렇지 않으면 0으로 변환됩니다.

이번 글에서는 실제 예제를 통해 이 동작을 확인해 보겠습니다.

1. 테이블 생성

먼저 StudentId 컬럼을 가진 테이블을 생성합니다.

mysql> create table DemoTable1390
    -> (
    -> StudentId varchar(20)
    -> );
Query OK, 0 rows affected (0.93 sec)

2. 데이터 삽입

INSERT 문을 사용해 여러 형태의 문자열 데이터를 입력합니다. 숫자로 시작하는 값과 그렇지 않은 값을 섞어서 넣는 것이 핵심입니다.

mysql> insert into DemoTable1390 values('563_John');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1390 values('1001_Carol_Taylor');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable1390 values('David_Miller_789');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable1390 values('456_AdamSmith');
Query OK, 1 row affected (0.11 sec)

3. 전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select * from DemoTable1390;

실행 결과는 다음과 같습니다.

+-------------------+
| StudentId         |
+-------------------+
| 563_John          |
| 1001_Carol_Taylor |
| David_Miller_789  |
| 456_AdamSmith     |
+-------------------+
4 rows in set (0.00 sec)

4. WHERE 절에서 숫자 조건으로 조회

이제 WHERE 절에서 StudentId 컬럼을 숫자 456과 비교해 보겠습니다.

mysql> select * from DemoTable1390 where StudentId=456;

결과는 다음과 같습니다.

+---------------+
| StudentId     |
+---------------+
| 456_AdamSmith |
+---------------+
1 row in set, 4 warnings (0.02 sec)

동작 원리 분석

'456_AdamSmith'는 정수로 시작하는 문자열이므로 MySQL이 비교 시 앞부분의 '456'을 정수로 변환하여 일치하는 것으로 판단했습니다. 반면 'David_Miller_789'처럼 문자로 시작하는 값은 정수 0으로 변환되기 때문에 조건에 맞지 않습니다.

또한 결과에 4 warnings가 표시된 점에 주목하세요. 문자열을 숫자로 강제 변환하는 과정에서 경고가 발생한 것입니다. 실무에서는 이러한 암시적 변환에 의존하기보다 다음과 같은 방법을 권장합니다.

  • ID와 이름을 별도의 컬럼으로 분리하여 설계
  • 필요하다면 CAST() 또는 SUBSTRING_INDEX() 같은 함수를 명시적으로 사용

암시적 타입 변환은 인덱스 사용을 방해해 성능 저하를 유발할 수 있으므로, 컬럼 타입을 일관되게 유지하는 것이 좋은 습관입니다.