본문 바로가기
컴퓨터 활용 팁/DataBase

int을(를) 데이터 형식 numeric(으)로 변환하는 중 산술 오버플로 오류가 발생했습니다.

by 대디동동 2023. 8. 3.
728x90

int을(를) 데이터 형식 numeric(으)로 변환 오류 해결

문제 원인

MS-SQL 서버에서 데이터 형변환 시 나타는 문제를 가지고 설명드리겠습니다.

에러 메시지 그대로 int 형식을 numeric 형태로 변환하는 중에 형식이 맞이 않아서 발생하는 문제입니다.

 

먼저 데이터 형식에 대하 이해가 먼저 필요합니다.

가장 많이 사용하는 정확한 수치형에는

구분 범위   바이트
bigint –9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 -2^63에서 2^63-1 8바이트
int –2,147,483,648 ~ 2,147,483,647 -2^31 ~ 2^31-1 4바이트
smallint –32,768 ~ 32,767 -2^15 ~ 2^15-1 2바이트
tinyint 0 ~ 255 2^0-1 ~ 2^8-1 1바이트
decimal
numeric


1 ~ 9   5바이트
10 ~ 19   9바이트
20 ~ 28   13바이트
29 ~ 38   17바이트

bigint, int, smallint, tinyint 는 형식을 선택만 해주면 되는데,

decimal, numeric 형태는 전체 자릿수 및 소수 자릿수를 입력해야 합니다.

 

아래 그림을 보시면 이해가 쉬우실 것 같습니다.

  • decimal(10, 5)
    • 숫자 10은 소수점을 포함한 전체 자릿수입니다.
    • 숫자 5는 소수점 자릿수를 나타냅니다.
    • 즉, 12345.67890 처럼 표현하기 위함이죠
    • 전체 자릿수는 10자리인데 소수점을 5자리로 설정하겠다는 의미입니다.
    • 123456790.12345 => X
  • numeric(18,2)
    • 숫자 18은 소숫점을 포함함 전체 자릿수입니다.
    • 숫자 0은 소수점 자릿수를 나타냅니다.
    • 즉, 123456789012345678.01

그럼, 아까 오류로 넘어가 보면 어떻게 해결해야 될지 방법을 아실 수 있습니다.

int, bigint 등 정수형 자료를 decimal, numeric  형태로 형변환 시 가장 많이 발생합니다.

특히, 다른 테이블과의 조인 시, 통계용 쿼리 작성 시 데이터 형식이 맞지 않을 경우 발생합니다.

 

해결방안

아래 표를 참고로 설명드려보겠습니다. Int 수량의 최댓값은 688200 이라고 가정합니다.

Int 수량 => Decimal 수량처럼 변경하려면 어떻게 쿼리 작성해야 할까요?

MS-SQL  형 변환 쿼리는 Convert와 Cast 두 개가 있는데 저는 Convert를 이용하겠습니다.

SELECT Convert(decimal(11, 5), [Int 수량]) as [Decimal 수량] FROM [테이블명] ==> O

SELECT Convert(decimal(10, 5), [Int 수량]) as [Decimal 수량] FROM [테이블명] ==> X

두 번째 구문은 Int 수량의 최댓값은 688200 으로 글자 자릿수는 6자리입니다.

우리가 만들려는 소수점 자릿수는 5자리라서 6 + 5 = 11 로  decimal(11, 5) 로 해야 오류 없이 변환이 됩니다.

다만, 위 예제의 경우는 최댓값이 688200 이지만 입력된 자료값이 다 다르기 때문에 경우에 맞게 하시면 됩니다.

참고로 int 형의 경우 –2,147,483,648 ~ 2,147,483,647 값을 가지니  10 + 원하는 소수점 자리수로 처리하면 되겠네요.

즉, 소숫점 자릿수를 3자리로 할 경우  decimal(13, 3) 처럼 하면 됩니다.

 

decimal, numeric 에 대한 자세한 내용은 아래 링크를 걸어 드렸습니다.

https://learn.microsoft.com/ko-kr/sql/t-sql/data-types/decimal-and-numeric-transact-sql?view=sql-server-ver16

 

decimal 및 numeric(Transact-SQL) - SQL Server

decimal 및 numeric 데이터 형식의 Transact-SQL 참조입니다. decimal 및 numeric은 고정 전체 자릿수와 소수 자릿수가 있는 숫자 데이터 형식의 동의어입니다.

learn.microsoft.com

개발자의 경우 프로그램 코딩만 하지 않습니다.

DataBase 관련한 사항 중 데이터 형태, 범위, 저장 바이트 정도는 기억하고 있으면

많은 도움이 됩니다.

반응형