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는 음수를 표현할 수 없다는 점을 항상 유의해야 합니다.