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

MySQL CAST를 활용한 숫자 오버플로우 처리 방법

MySQL CAST로 오버플로우 다루기

MySQL에서 수치 표현식을 평가하는 과정에서 오버플로우(overflow)가 발생할 수 있습니다. 일반적으로 오버플로우가 발생하면 MySQL은 에러 메시지를 반환합니다. 하지만 CAST 함수를 사용해 해당 숫자 값을 UNSIGNED 타입으로 변환하면 이러한 오버플로우 문제를 손쉽게 해결할 수 있습니다.

오버플로우가 발생하는 경우

BIGINT 타입의 최대값에 1을 더하면 범위를 초과하기 때문에 MySQL은 아래와 같이 에러를 출력합니다.

mysql> Select 9223372036854775807 + 1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807+1)'

BIGINT의 최대값은 9223372036854775807(2^63 − 1)이며, 여기에 1을 더하면 부호 있는 정수 범위를 벗어나기 때문에 위와 같은 에러가 발생합니다.

CAST를 사용한 오버플로우 해결

이때 CAST(... AS UNSIGNED)를 사용하면 값을 부호 없는 정수로 변환하여 계산할 수 있으므로, 오버플로우 없이 정상적으로 결과를 얻을 수 있습니다.

mysql> Select CAST(9223372036854775807 AS UNSIGNED) +1;

+------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) +1 |
+------------------------------------------+
| 9223372036854775808                      |
+------------------------------------------+
1 row in set (0.07 sec)

결과를 보면 에러 대신 9223372036854775808(2^63)이라는 값이 정상적으로 반환됩니다. UNSIGNED 타입은 0부터 18446744073709551615(2^64 − 1)까지 표현할 수 있으므로, BIGINT 최대값보다 큰 값도 저장하고 연산할 수 있습니다.

정리

수치 연산 중 범위 초과로 인한 에러가 발생하더라도, CAST를 통해 데이터 타입을 UNSIGNED로 변환하면 MySQL이 오버플로우를 자연스럽게 처리하도록 할 수 있습니다. 다만 UNSIGNED는 음수를 표현할 수 없다는 점을 항상 유의해야 합니다.