Work

[펌] decimal 및 numeric(Transact-SQL)

runicode 2013. 12. 12. 15:05
전체 자릿수와 소수 자릿수가 고정된 숫자 데이터 형식입니다.
decimal [ (p[ ,s] )] 및 numeric[ (p[ ,s] )]

고정 전체 자릿수 및 소수 자릿수 값입니다. 최대 전체 자릿수를 사용하는 경우 유효한 값은 - 10^38 + 1부터 10^38 - 1까지입니다. decimal 의 ISO 동의어는 decdec(p, s)입니다. numeric 함수는 decimal과 동일한 기능을 합니다.

 
p(전체 자릿수)

소수점 왼쪽과 오른쪽에 저장할 최대 전체 자릿수입니다. 전체 자릿수 값은 1에서 최대 전체 자릿수인 38 사이여야 합니다. 기본 전체 자릿수는 18입니다.

 
s (소수 자릿수)

소수점 오른쪽에 저장할 소수 자릿수입니다. p에서 이 숫자를 빼서 소수점 왼쪽의 최대 자릿수가 결정됩니다. 소수 자릿수 값은 0에서 p 사이여야 합니다. 소수 자릿수는 전체 자릿수를 지정한 경우에만 지정할 수 있습니다. 기본 소수 자릿수는 0입니다. 따라서 0 <= s <= p입니다. 전체 자릿수에 따라 최대 저장소 크기가 달라집니다.

 

전체 자릿수

저장소 크기(바이트)

1 - 9

5

10-19

9

20-28

13

29-38

17

 

 

decimal numeric 데이터 형식의 경우 SQL Server는 전체 자릿수와 소수 자릿수의 각 특정 조합을 다른 데이터 형식으로 간주합니다. 예를 들면 decimal(5,5)decimal(5,0)은 다른 데이터 형식으로 간주됩니다.

Transact-SQL 문에서 소수점이 있는 상수는 필요한 최소 전체 자릿수 및 소수 자릿수를 사용하여 numeric 데이터 값으로 자동 변환됩니다. 예를 들어 상수 12.345는 전체 자릿수가 5이고 소수 자릿수가 3인 numeric 값으로 변환됩니다.

decimal 또는 numeric에서 float 또는 real로 변환하면 전체 자릿수가 손실될 수 있습니다. int , smallint, tinyint, float, real, money 또는 smallmoney에서 decimal 또는 numeric으로 변환하면 오버플로가 발생할 수 있습니다.

기본적으로 SQL Server는 숫자를 전체 자릿수 및 소수 자릿수가 낮은 decimal 또는 numeric 값으로 변환할 때 반올림을 사용합니다. 그러나 SET ARITHABORT 옵션이 ON이면 SQL Server는 오버플로가 발생할 때 오류를 일으킵니다. 전체 자릿수 및 소수 자릿수의 손실만으로는 오류가 발생하지 않습니다.

float 또는 real 값을 decimal 또는 numeric으로 변환하는 경우 10진수 값은 17자리를 넘을 수 없습니다. 5E-18보다 작은 모든 float 값은 항상 0으로 변환됩니다.

 

 

 

출처 : http://msdn.microsoft.com/ko-kr/library/ms187746.aspx