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

MySQL varchar 필드에 저장된 숫자를 비교하는 방법

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 등 숫자형으로 설계하는 것이 좋습니다.