有効桁数、小数点以下桁数、および長さ (Transact-SQL)Precision, scale, and Length (Transact-SQL)

適用対象: ○SQL Server (2012 以降) XAzure SQL Database XAzure SQL Data Warehouse XParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2012) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

precision は、数値全体の桁数です。Precision is the number of digits in a number. scale は、数値の中で小数点より右側の桁数です。Scale is the number of digits to the right of the decimal point in a number. たとえば、123.45 という値の場合、precision は 5 で、scale は 2 になります。For example, the number 123.45 has a precision of 5 and a scale of 2.

SQL ServerSQL Server では、numeric および decimal データ型の precision の既定の最大値は 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. 文字列または Unicode データ型の長さは文字数です。Length for a character string or Unicode data type is the number of characters. binaryvarbinary、および image データ型の長さはバイト数です。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 データ型の precision は 10、長さは 4、scale は 0 です。The int data type has a precision of 10, a length of 4, and a scale of 0.

charvarcharbinary、または varbinary 式を 2 つ連結する場合、結果として得られる式の長さは 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 characters.

nchar または nvarchar 式を 2 つ連結する場合、結果として得られる式の長さは 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 characters.

同じデータ型で長さが異なる 2 つの式が、UNION、EXCEPT、または INTERSECT を使って比較される場合、結果の長さは 2 つの式のうち長い方です。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.

decimal を除いた数値データ型の precision と scale は固定です。The precision and scale of the numeric data types besides decimal are fixed. 同じデータ型の 2 つの式に算術演算子を使用する場合、得られる結果のデータ型は同じになり、そのデータ型に定義されている precision と scale が適用されます。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. 異なるデータ型の 2 つの式に演算子を使用する場合、結果のデータ型はデータ型の優先順位規則によって決まります。If an operator has two expressions with different numeric data types, the rules of data type precedence define the data type of the result. 結果には、そのデータ型に定義されている precision と scale が適用されます。The result has the precision and scale defined for its data type.

次の表では、演算の結果が decimal 型の場合に precision と scale がどのように計算されるかを定義しています。The following table defines how the precision and scale of the result are calculated when the result of an operation is of type decimal. 次のいずれかの場合、結果は decimal です。The result is decimal when either:

  • 両方の式が decimal である。Both expressions are decimal.
  • 一方の式が decimal で、もう一方が decimal よりも優先順位の低いデータ型である。One expression is decimal and the other is a data type with a lower precedence than decimal.

オペランド式は、precision が p1 で scale が s1 の式 e1 と、precision が p2 で scale が 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. decimal でない任意の式の precision と scale は、その式のデータ型に定義された precision と scale です。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) は、"b" と "a"のうち、小さいほうの値を取ることを示しています。Similarly, min(a,b) indicates to take the smaller value of "a" or "b".

演算Operation 結果の precisionResult precision 結果の scale *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)

* 結果の precision と scale の絶対最大値は 38 です。* The result precision and scale have an absolute maximum of 38. 結果の precision が 38 桁を超える場合は 38 桁に減らされます。この際、結果の整数部分が切り捨てられることを防ぐために、scale が減らされます。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. 乗算や除算などの演算では、decimal の precision を維持するために scale が減らされることはありません。これは、オーバーフロー エラーが発生する可能性がある場合でも同じです。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.

加算と減算では、decimal の整数部を格納するのに 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) の場合は、整数部の領域を提供するために、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. 結果の scale は 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. 次のルールを使用して、scale が減らされることがあります。The scale might be reduced using the following rules:

  1. 整数部が 32 桁よりも少ない場合、結果の scale は 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. scale が 6 桁未満であり、整数部が 32 を超える場合、scale が変更されることはありません。The scale won't be changed if it's less than 6 and if the integral part is greater than 32. これに該当する場合、decimal(38, scale) に収まらなければ、オーバーフロー エラーが発生することがありますIn this case, overflow error might be raised if it can't fit into decimal(38, scale)
  3. scale が 6 桁以上であり、整数部が 32 を超える場合、scale は 6 に設定されます。The scale will be set to 6 if it's greater than 6 and if the integral part is greater than 32. これに該当する場合、整数部の桁数と scale の両方が減らされ、結果の型は decimal(38,6) になります。In this case, both integral part and scale would be reduced and resulting type is decimal(38,6). 結果は、小数点以下の桁数が 6 桁に丸められるか、整数部を 32 桁に収めることができない場合はオーバーフロー エラーがスローされます。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

次の式は、丸めなしの結果 0.00000090000000000 を返します。これは、結果が decimal(38,17) に収まるためです。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]

ここでは、precision は 61 であり、scale は 40 です。In this case precision is 61, and scale is 40. 整数部 (precision-scale = 21) が 32 未満であり、乗算ルールの (1) に該当するため、scale は 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).

次の式は、decimal(38,6) に収めた結果 0.000001 を返します。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)]

ここでは、precision は 61 であり、scale は 20 です。In this case precision is 61, and scale is 20. scale が 6 桁を越えており、整数部 (precision-scale = 41) が 32 を超えています。Scale is greater than 6 and integral part (precision-scale = 41) is greater than 32. これは乗算ルールの (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)