전체 자릿수, 소수 자릿수 및 길이(Transact-SQL)Precision, scale, and Length (Transact-SQL)

적용 대상: 예SQL Server 아니요Azure SQL Database 아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

전체 자릿수는 숫자의 모든 자릿수이고Precision is the number of digits in a number. 소수 자릿수는 숫자에서 소수점 오른쪽에 있는 자릿수입니다.Scale is the number of digits to the right of the decimal point in a number. 예를 들어 123.45의 전체 자릿수는 5이고 소수 자릿수는 2입니다.For example, the number 123.45 has a precision of 5 and a scale of 2.

SQL ServerSQL Server에서 숫자10진수 데이터 형식의 기본 최대 전체 자릿수는 38입니다.In SQL ServerSQL Server, the default maximum precision of numeric and decimal data types is 38. 이전 버전의 SQL ServerSQL Server에서 기본 최대 전체 자릿수는 28입니다.In earlier versions of SQL ServerSQL Server, the default maximum is 28.

숫자 데이터 형식의 길이는 해당 숫자를 저장하는 데 사용된 바이트 수이고Length for a numeric data type is the number of bytes that are used to store the number. varchar와 char에서 문자열의 길이는 바이트 수입니다.For varchar and char, the length of a character string is the number of bytes. nvarchar와 nchar에서 문자열의 길이는 바이트 쌍 수입니다.For nvarchar and nchar, the length of the character string is the number of byte-pairs. binary, varbinaryimage 데이터 유형의 길이는 바이트 수입니다.The length for binary, varbinary, and image data types is the number of bytes. 예를 들어 int 데이터 형식은 10자리까지 지정할 수 있고 4바이트로 저장되며 소수점은 허용되지 않습니다.For example, an int data type can hold 10 digits, is stored in 4 bytes, and doesn't accept decimal points. int 데이터 형식의 전체 자릿수는 10이고 길이는 4, 소수 자릿수는 0입니다.The int data type has a precision of 10, a length of 4, and a scale of 0.

char, varchar, binary 또는 varbinary 식 2개를 연결하는 경우 결과 식의 길이는 두 원본 식의 길이를 합한 값으로 최대 8,000바이트입니다.When concatenating two char, varchar, binary, or varbinary expressions, the length of the resulting expression is the sum of the lengths of the two source expressions, up to 8,000 bytes.

nchar 또는 nvarchar 식 2개를 연결하는 경우 결과 식의 길이는 두 원본 식의 길이를 합한 값으로 최대 4,000바이트 쌍입니다.When concatenating two nchar or nvarchar expressions, the length of the resulting expression is the sum of the lengths of the two source expressions, up to 4,000 byte-pairs.

UNION, EXCEPT 또는 INTERSECT를 사용하여 데이터 형식은 같지만 길이가 다른 두 식을 비교할 때 결과 길이는 두 식의 더 긴 길이가 됩니다.When comparing two expressions of the same data type but different lengths by using UNION, EXCEPT, or INTERSECT, the resulting length is the longer of the two expressions.

10진수를 제외한 숫자 데이터 형식의 전체 자릿수와 소수 자릿수는 고정되어 있습니다.The precision and scale of the numeric data types besides decimal are fixed. 데이터 형식이 동일한 두 식을 산술 연산자로 결합할 때 결과는 해당 형식에 정의된 전체 자릿수와 소수 자릿수를 가진 동일한 데이터 형식이 됩니다.When an arithmetic operator has two expressions of the same type, the result has the same data type with the precision and scale defined for that type. 다른 숫자 데이터 형식을 가진 두 식을 연산자로 결합하면 데이터 형식 우선 순위에 따라 결과의 데이터 형식이 정의됩니다.If an operator has two expressions with different numeric data types, the rules of data type precedence define the data type of the result. 결과는 해당 데이터 형식에 대해 정의된 전체 자릿수와 소수 자릿수를 갖습니다.The result has the precision and scale defined for its data type.

다음 표에서는 연산의 결과가 10진수 형식일 경우 결과의 전체 자릿수와 소수 자릿수를 계산하는 방법을 정의합니다.The following table defines how the precision and scale of the result are calculated when the result of an operation is of type decimal. 다음 중 하나일 때 결과는 10진수입니다.The result is decimal when either:

  • 두 식은 모두 10진수입니다.Both expressions are decimal.
  • 한 식이 10진수이고 다른 식이 10진수보다 선행 규칙이 낮은 데이터 형식일 경우One expression is decimal and the other is a data type with a lower precedence than decimal.

피연산자 식은 전체 자릿수 p1과 소수 자릿수 s1을 가진 식 e1, 전체 자릿수 p2와 소수 자릿수 s2를 가진 식 e2로 표시합니다.The operand expressions are denoted as expression e1, with precision p1 and scale s1, and expression e2, with precision p2 and scale s2. 10진수가 아닌 모든 식의 전체 자릿수와 소수 자릿수는 해당 식의 데이터 형식에 대해 정의된 전체 자릿수와 소수 자릿수입니다.The precision and scale for any expression that is not decimal is the precision and scale defined for the data type of the expression. 함수 max(a,b)는 "a" 또는 "b"의 더 큰 값을 사용합니다.The function max(a,b) means the following: take the greater value of "a" or "b". 마찬가지로 min(a,b)은 "a" 또는 "b"의 더 작은 값을 사용합니다.Similarly, min(a,b) indicates to take the smaller value of "a" or "b".

연산Operation 결과 전체 자릿수Result precision 결과 소수 자릿수 *Result scale *
e1 + e2e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)max(s1, s2)
e1 - e2e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) + 1max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)max(s1, s2)
e1 * e2e1 * e2 p1 + p2 + 1p1 + p2 + 1 s1 + s2s1 + s2
e1 / e2e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1)p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1)max(6, s1 + p2 + 1)
e1 { UNION | EXCEPT | INTERSECT } e2e1 { UNION | EXCEPT | INTERSECT } e2 max(s1, s2) + max(p1-s1, p2-s2)max(s1, s2) + max(p1-s1, p2-s2) max(s1, s2)max(s1, s2)
e1 % e2e1 % e2 min(p1-s1, p2 -s2) + max( s1,s2 )min(p1-s1, p2 -s2) + max( s1,s2 ) max(s1, s2)max(s1, s2)

* 결과 전체 자릿수와 소수 자릿수의 최대값은 38입니다.* The result precision and scale have an absolute maximum of 38. 결과 전체 자릿수가 38보다 크면 38로 줄어들고 결과의 정수 부분이 잘리지 않도록 해당 소수 자릿수가 줄어듭니다.When a result precision is greater than 38, it's reduced to 38, and the corresponding scale is reduced to try to prevent truncating the integral part of a result. 곱하기나 나누기 같은 일부의 경우에는 오버플로 오류가 발생할 수 있지만 소수점 이하 자릿수를 유지하기 위해 소수 자릿수가 줄어들지 않습니다.In some cases such as multiplication or division, scale factor won't be reduced, to maintain decimal precision, although the overflow error can be raised.

더하기 및 빼기 연산에서 10진수의 정수 부분을 저장할 max(p1 - s1, p2 - s2) 장소가 필요합니다.In addition and subtraction operations, we need max(p1 - s1, p2 - s2) places to store integral part of the decimal number. max(p1 - s1, p2 - s2) < min(38, precision) - scale을 저장할 공간이 충분하지 않으면 소수 자릿수는 정수 부분에 충분한 공간을 제공하도록 줄어듭니다.If there isn't enough space to store them that is, max(p1 - s1, p2 - s2) < min(38, precision) - scale, the scale is reduced to provide enough space for integral part. 결과 소수 자릿수는 MIN(precision, 38) - max(p1 - s1, p2 - s2)이므로 소수 부분은 결과 소수 자릿수에 맞게 반올림될 수 있습니다.Resulting scale is MIN(precision, 38) - max(p1 - s1, p2 - s2), so the fractional part might be rounded to fit into the resulting scale.

곱하기 및 나누기 연산에서 결과의 정수 부분을 저장하기 위해 precision - scale 장소가 필요합니다.In multiplication and division operations, we need precision - scale places to store the integral part of the result. 다음 규칙을 사용하여 소수 자릿수를 줄일 수 있습니다.The scale might be reduced using the following rules:

  1. 정수 부분이 32보다 작으면 결과적인 소수 자릿수가 38 - (precision-scale)보다 클 수 없으므로 min(scale, 38 - (precision-scale))로 줄어듭니다.The resulting scale is reduced to min(scale, 38 - (precision-scale)) if the integral part is less than 32, because it can't be greater than 38 - (precision-scale). 이 경우 결과가 반올림 될 수도 있습니다.Result might be rounded in this case.
  2. 6보다 작고 정수 부분이 32보다 큰 경우 소수 자릿수는 변경되지 않습니다.The scale won't be changed if it's less than 6 and if the integral part is greater than 32. 이 경우 10진수(38, 소수 자릿수)에 맞지 않아 오버플로 오류가 발생할 수 있습니다.In this case, overflow error might be raised if it can't fit into decimal(38, scale)
  3. 6보다 크고 정수 부분이 32보다 큰 경우 소수 자릿수는 6으로 설정됩니다.The scale will be set to 6 if it's greater than 6 and if the integral part is greater than 32. 이 경우 정수 부분과 소수 자릿수 모두 줄어들 수도 있고 결과 형식은 10진수(38,6)입니다.In this case, both integral part and scale would be reduced and resulting type is decimal(38,6). 정수 부분이 32 자릿수에 맞지 않으면 결과가 소수점 이하 6 자리로 반올림되거나 오버플로 오류가 발생합니다.Result might be rounded to 6 decimal places or the overflow error will be thrown if the integral part can't fit into 32 digits.

Examples

다음 표현식은 결과가 decimal(38,17)에 맞을 수 있으므로 결과 0.00000090000000000을 반올림하지 않고 반환합니다.The following expression returns result 0.00000090000000000 without rounding, because result can fit into decimal(38,17):

select cast(0.0000009000 as decimal(30,20)) * cast(1.0000000000 as decimal(30,20)) [decimal 38,17]

이 경우 전체 자릿수는 61이고 소수 자릿수는 40입니다.In this case precision is 61, and scale is 40. 정수 부분(전체 자릿수-소수 자릿수 = 21)은 32보다 작으므로 이 경우에는 곱하기 규칙에서 case(1)이고 소수 자릿수는 min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17로 계산됩니다.Integral part (precision-scale = 21) is less than 32, so this case is case (1) in multiplication rules and scale is calculated as min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17. 결과 형식은 decimal(38,17)입니다.Result type is decimal(38,17).

다음 식은 결과 0.000001decimal(38,6)에 맞게 반환합니다.The following expression returns result 0.000001 to fit into decimal(38,6):

select cast(0.0000009000 as decimal(30,10)) * cast(1.0000000000 as decimal(30,10)) [decimal(38, 6)]

이 경우 전체 자릿수는 61이고 소수 자릿수는 20입니다.In this case precision is 61, and scale is 20. 소수 자릿수는 6보다 크고 정수 부분은(precision-scale = 41)은 32보다 큽니다.Scale is greater than 6 and integral part (precision-scale = 41) is greater than 32. 이 경우는 곱하기 규칙에서 case(3)이고 결과 형식은 decimal(38,6)입니다.This case is case (3) in multiplication rules and result type is decimal(38,6).

관련 항목:See also

식(Transact-SQL)Expressions (Transact-SQL)
데이터 형식(Transact-SQL)Data Types (Transact-SQL)