MySQL CONV() 함수를 활용한 진법 변환
MySQL에서는 CONV() 함수를 사용하면 하나의 진법(기수 체계)을 다른 진법으로 손쉽게 변환할 수 있습니다. 가장 대표적인 예가 16진수(hexadecimal)를 10진수(decimal)로 변환하는 것입니다. 여기서 16은 16진법, 10은 10진법을 의미합니다.
CONV() 함수 기본 문법
SELECT CAST(CONV('컬럼명', 16, 10) AS UNSIGNED INTEGER) AS 별칭 FROM 테이블명;CONV() 함수의 첫 번째 인자는 변환할 값, 두 번째 인자는 원래 진법(여기서는 16진수), 세 번째 인자는 변환할 진법(여기서는 10진수)입니다. 여기에 CAST(... AS UNSIGNED INTEGER)를 함께 사용하면 결과를 부호 없는 정수형으로 변환되어 매우 큰 숫자도 안전하게 다룰 수 있습니다.
예제 테이블 생성
문법을 실제로 이해하기 위해 먼저 테이블을 생성해 보겠습니다.
mysql> create table castTypeToBigIntDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Value varchar(100),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (1.19 sec)
테스트 데이터 삽입
INSERT 명령어로 16진수 형태의 문자열 데이터를 여러 건 삽입합니다.
mysql> insert into castTypeToBigIntDemo(Value) values('AB5');
Query OK, 1 row affected (0.13 sec)
mysql> insert into castTypeToBigIntDemo(Value) values('55244A5562C5566354');
Query OK, 1 row affected (0.15 sec)
mysql> insert into castTypeToBigIntDemo(Value) values('4546575765ABD78');
Query OK, 1 row affected (0.15 sec)
mysql> insert into castTypeToBigIntDemo(Value) values('5979787DEFAB');
Query OK, 1 row affected (0.19 sec)
mysql> insert into castTypeToBigIntDemo(Value) values('86868686856ABD');
Query OK, 1 row affected (0.17 sec)저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from castTypeToBigIntDemo;
실행 결과는 다음과 같습니다.
+----+--------------------+
| Id | Value |
+----+--------------------+
| 1 | AB5 |
| 2 | 55244A5562C5566354 |
| 3 | 4546575765ABD78 |
| 4 | 5979787DEFAB |
| 5 | 86868686856ABD |
+----+--------------------+
5 rows in set (0.00 sec)
16진수를 BigInt(부호 없는 정수)로 변환하는 쿼리
이제 Value 컬럼의 16진수 값을 10진수로 변환하여 조회하는 실제 쿼리입니다.
mysql> SELECT CAST(CONV(Value,16,10) AS UNSIGNED INTEGER) AS BigNumber
-> from castTypeToBigIntDemo;
실행 결과는 다음과 같습니다.
+----------------------+
| BigNumber |
+----------------------+
| 2741 |
| 18446744073709551615 |
| 311985829366644088 |
| 98378247434155 |
| 37865559219858109 |
+----------------------+
5 rows in set, 1 warning (0.00 sec)
주의 사항: 오버플로 경고
결과 하단에 1 warning이 표시된 점에 주목하세요. 두 번째 값인 '55244A5562C5566354'는 MySQL의 UNSIGNED BIGINT가 표현할 수 있는 최대 범위인 18,446,744,073,709,551,615를 초과합니다. 이 경우 MySQL은 해당 값을 최댓값으로 잘라내고 경고를 발생시킵니다. 따라서 자릿수가 큰 16진수 값을 변환할 때는 반드시 결과값의 범위와 경고 메시지를 확인하는 것이 좋습니다.