MySQL에서 점수처럼 숫자 형태의 데이터를 varchar 타입 컬럼에 저장한 경우, 단순히 비교 연산자(>, <)만 사용하면 문자열 기준으로 비교되기 때문에 의도와 다른 결과가 나올 수 있습니다. 예를 들어 문자열 비교에서는 '100'이 '90'보다 작다고 판단됩니다. 이러한 문제를 해결하려면 CAST() 함수를 사용해 문자열을 숫자로 변환한 후 비교해야 합니다. 아래 예제를 통해 자세히 살펴보겠습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
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 필드 비교
varchar로 저장된 점수를 숫자로 변환하여 91보다 큰 레코드를 조회하는 쿼리는 다음과 같습니다.
mysql> select *from DemoTable where CAST(StudentScore AS SIGNED) > 91;
출력 결과
+-----------+--------------+
| StudentId | StudentScore |
+-----------+--------------+
| 2 | 100 |
| 4 | 98 |
+-----------+--------------+
2 rows in set (0.00 sec)
위 결과에서 볼 수 있듯이, CAST(StudentScore AS SIGNED)를 적용하면 문자열이 아닌 정수 값으로 비교되므로 91보다 큰 점수인 100과 98이 정확하게 조회됩니다. 만약 CAST 없이 StudentScore > '91'처럼 비교했다면 문자열 사전순 비교가 수행되어 잘못된 결과가 반환될 수 있으니 주의해야 합니다.