MySQL에서 varchar 타입의 컬럼에 숫자가 문자열로 저장되어 있을 때도 비교 연산이 가능합니다. 핵심은 CAST() 함수를 사용해 문자열을 숫자 타입으로 변환한 뒤 비교하는 것입니다.
아래 예제를 통해 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 학생 점수를 varchar로 저장하는 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentScore varchar(100)
-> );
Query OK, 0 rows affected (0.66 sec)2. 데이터 삽입하기
INSERT 문을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable(StudentScore) values('90');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable(StudentScore) values('100');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(StudentScore) values('56');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(StudentScore) values('98');
Query OK, 1 row affected (0.13 sec)3. 전체 데이터 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-----------+--------------+ | StudentId | StudentScore | +-----------+--------------+ | 1 | 90 | | 2 | 100 | | 3 | 56 | | 4 | 98 | +-----------+--------------+ 4 rows in set (0.00 sec)
4. CAST()를 이용한 숫자 비교
varchar 컬럼을 직접 비교하면 문자열 기준(사전순)으로 처리되기 때문에 의도한 결과가 나오지 않을 수 있습니다. 따라서 CAST() 함수로 SIGNED(부호 있는 정수) 타입으로 변환한 후 비교해야 합니다.
점수가 91보다 큰 학생을 조회하는 쿼리는 다음과 같습니다.
mysql> select *from DemoTable where CAST(StudentScore AS SIGNED) > 91;
실행 결과:
+-----------+--------------+ | StudentId | StudentScore | +-----------+--------------+ | 2 | 100 | | 4 | 98 | +-----------+--------------+ 2 rows in set (0.00 sec)
'100'과 '98'이 정상적으로 91보다 큰 값으로 인식된 것을 확인할 수 있습니다. 만약 CAST 없이 문자열 그대로 비교했다면 '56' 같은 값도 사전순 비교에 따라 잘못된 결과가 나올 수 있습니다.
참고 사항
- SIGNED vs UNSIGNED: 음수 값이 포함될 가능성이 있다면 SIGNED를, 항상 양수만 저장된다면 UNSIGNED를 사용할 수 있습니다.
- 비숫자 데이터 주의: 컬럼에 숫자가 아닌 값이 섞여 있으면 변환 시 경고가 발생하고 해당 값은 0으로 처리되므로, WHERE 조건에
StudentScore REGEXP '^[0-9]+$'를 함께 사용하는 것이 안전합니다. - 성능: CAST를 적용한 컬럼에는 인덱스가 활용되지 않으므로, 대량의 데이터를 다룬다면 처음부터 컬럼 타입을 INT 등 숫자형으로 설계하는 것이 좋습니다.