MySQL에서 LONGTEXT 타입 컬럼에는 아주 큰 숫자도 저장할 수 있지만, 값 자체는 문자열로 취급됩니다. 그렇기 때문에 ORDER BY로 정렬하면 의도와 달리 사전식(문자열) 순서로 정렬되는 문제가 발생합니다. 이번 글에서는 LONGTEXT에 저장된 숫자를 쿼리 안에서 정수처럼 처리하는 방법을 예제와 함께 알아보겠습니다.
1. 테스트 테이블 생성하기
먼저 LONGTEXT 타입의 컬럼을 가진 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
-> (
-> Value longtext
-> );
Query OK, 0 rows affected (0.94 sec)
2. 샘플 데이터 삽입하기
INSERT 문을 사용해 일반 정수형(BIGINT)으로는 담기 어려운 아주 큰 숫자들을 문자열 형태로 저장합니다.
mysql> insert into DemoTable values('778437437447488487476464644433334');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('9998888485775775757577578585');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('8888874757757757757757575675656');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('988757757574646');
Query OK, 1 row affected (0.09 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 전체 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable; +-----------------------------------+ | Value | +-----------------------------------+ | 778437437447488487476464644433334 | | 9998888485775775757577578585 | | 8888874757757757757757575675656 | | 988757757574646 | +-----------------------------------+ 4 rows in set (0.00 sec)
4. LONGTEXT를 정수처럼 정렬하는 핵심 쿼리
핵심은 아주 간단합니다. 컬럼 값에 +0을 더해주면 MySQL이 해당 값을 자동으로 숫자로 변환(암시적 형변환)하여 계산합니다. 이를 활용하면 다음과 같이 숫자 크기 기준으로 정렬할 수 있습니다.
mysql> select * from DemoTable
-> order by Value+0;
실행 결과를 보면 이번에는 문자열 순서가 아니라 실제 숫자 크기 순서대로 오름차순 정렬된 것을 확인할 수 있습니다.
+-----------------------------------+ | Value | +-----------------------------------+ | 988757757574646 | | 9998888485775775757577578585 | | 8888874757757757757757575675656 | | 778437437447488487476464644433334 | +-----------------------------------+ 4 rows in set (0.03 sec)
추가 팁: CAST() 함수로 명시적 형변환하기
+0 대신 CAST() 함수를 사용하면 의도를 더 명확하게 드러낼 수 있습니다.
mysql> select * from DemoTable
-> order by cast(Value as unsigned);
다만 주의할 점이 있습니다. UNSIGNED BIGINT의 최댓값은 약 1,844경(18,446,744,073,709,551,615)이므로 이보다 큰 값은 범위를 초과합니다. 예제처럼 자릿수가 매우 큰 숫자라면 DECIMAL로 변환하는 것이 안전합니다.
mysql> select * from DemoTable
-> order by cast(Value as decimal(65,0));
정리
- LONGTEXT에 저장된 숫자는 문자열이므로 정렬·비교 시 문자열 규칙이 적용됩니다.
컬럼명+0또는CAST()를 사용하면 쿼리 내에서 해당 값을 숫자로 변환해 처리할 수 있습니다.- BIGINT 범위를 넘는 초대형 숫자는
DECIMAL로 변환하는 것이 가장 안전합니다.