Precisão, escala e comprimento (Transact-SQL)Precision, scale, and Length (Transact-SQL)

APLICA-SE A: simSQL Server nãoBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

A precisão é o número de dígitos em um número.Precision is the number of digits in a number. A escala é o número de dígitos à direita da casa decimal em um número.Scale is the number of digits to the right of the decimal point in a number. Por exemplo, o número 123,45 tem uma precisão de 5 e uma escala de 2.For example, the number 123.45 has a precision of 5 and a scale of 2.

Em SQL ServerSQL Server, a precisão máxima padrão dos tipos de dados numeric e decimal é 38.In SQL ServerSQL Server, the default maximum precision of numeric and decimal data types is 38. Em versões anteriores do SQL ServerSQL Server, o máximo padrão é 28.In earlier versions of SQL ServerSQL Server, the default maximum is 28.

O comprimento de um tipo de dados numérico é o número de bytes usado para armazenar o número.Length for a numeric data type is the number of bytes that are used to store the number. Para varchar e char, o tamanho de uma cadeia de caracteres é o número de bytes.For varchar and char, the length of a character string is the number of bytes. Para nvarchar e nchar, o tamanho da cadeia de caracteres é o número de pares de bytes.For nvarchar and nchar, the length of the character string is the number of byte-pairs. O comprimento para os tipos de dados binary, varbinary e image é o número de bytes.The length for binary, varbinary, and image data types is the number of bytes. Por exemplo, um tipo de dados int pode conter 10 dígitos, é armazenado em 4 bytes e não aceita casas decimais.For example, an int data type can hold 10 digits, is stored in 4 bytes, and doesn't accept decimal points. O tipo de dados int tem uma precisão de 10, um comprimento de 4 e uma escala de 0.The int data type has a precision of 10, a length of 4, and a scale of 0.

Ao concatenar duas expressões char, varchar, binary ou varbinary, o tamanho da expressão resultante é a soma dos tamanhos das duas expressões de origem, até 8 mil bytes.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.

Ao concatenar duas expressões nchar ou nvarchar, o tamanho da expressão resultante é a soma dos tamanhos das duas expressões de origem, até 4 mil pares de bytes.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.

Ao comparar duas expressões do mesmo tipo de dados, mas diferentes comprimentos usando UNION, EXCEPT ou INTERSECT, o comprimento resultante é o mais longo das duas expressões.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.

A precisão e a escala dos tipos de dados numéricos além de decimal são fixos.The precision and scale of the numeric data types besides decimal are fixed. Quando um operador aritmético tiver duas expressões do mesmo tipo, o resultado terá o mesmo tipo de dados com precisão e escala definidas para esse tipo.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. Se um operador aritmético tiver duas expressões com tipos de dados numéricos diferentes, a regras de precedência do tipo de dados definirão os tipos de dados do resultado.If an operator has two expressions with different numeric data types, the rules of data type precedence define the data type of the result. O resultado terá a precisão e a escala definidas para seu tipo de dados.The result has the precision and scale defined for its data type.

A tabela a seguir define como a precisão e a escala do resultado são calculadas quando o resultado de uma operação é do tipo decimal.The following table defines how the precision and scale of the result are calculated when the result of an operation is of type decimal. O resultado será decimal quando qualquer um dos:The result is decimal when either:

  • As duas expressões são do tipo decimal.Both expressions are decimal.
  • Uma expressão é decimal e a outra é um tipo de dados com uma precedência inferior a decimal.One expression is decimal and the other is a data type with a lower precedence than decimal.

As expressões de operandos são indicadas como expressão e1, com precisão p1 e escala s1, e expressão e2, com precisão p2 e escala s2.The operand expressions are denoted as expression e1, with precision p1 and scale s1, and expression e2, with precision p2 and scale s2. A precisão e a escala de qualquer expressão que não seja decimal serão aquelas definidas para o tipo de dados da expressão.The precision and scale for any expression that is not decimal is the precision and scale defined for the data type of the expression. A função max(a,b) significa o seguinte: obter o maior valor de "a" ou "b".The function max(a,b) means the following: take the greater value of "a" or "b". Da mesma forma, min(a,b) obterá o menor valor de "a" ou "b".Similarly, min(a,b) indicates to take the smaller value of "a" or "b".

OperaçãoOperation Precisão de resultadoResult precision Escala de resultado*Result scale *
e1 + e2e1 + e2 máx(s1, s2) + máx(p1-s1, p2-s2) + 1max(s1, s2) + max(p1-s1, p2-s2) + 1 máx(s1, s2)max(s1, s2)
e1 - e2e1 - e2 máx(s1, s2) + máx(p1-s1, p2-s2) + 1max(s1, s2) + max(p1-s1, p2-s2) + 1 máx(s1, s2)max(s1, s2)
e1 * e2e1 * e2 p1 + p2 + 1p1 + p2 + 1 s1 + s2s1 + s2
e1 / e2e1 / e2 p1 - s1 + s2 + máx(6, s1 + p2 + 1)p1 - s1 + s2 + max(6, s1 + p2 + 1) máx(6, s1 + p2 + 1)max(6, s1 + p2 + 1)
e1 { UNION | EXCEPT | INTERSECT } e2e1 { UNION | EXCEPT | INTERSECT } e2 máx(s1, s2) + máx(p1-s1, p2-s2)max(s1, s2) + max(p1-s1, p2-s2) máx(s1, s2)max(s1, s2)
e1 % e2e1 % e2 mín(p1-s1, p2 -s2) + máx( s1,s2 )min(p1-s1, p2 -s2) + max( s1,s2 ) máx(s1, s2)max(s1, s2)

* A precisão e a escala de resultado têm um máximo absoluto de 38.* The result precision and scale have an absolute maximum of 38. Quando uma precisão de resultado for maior que 38, ela será reduzida para 38 e a escala correspondente será reduzida para tentar evitar o truncamento da parte integral de um resultado.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. Em alguns casos, como multiplicação ou divisão, o fator de escala não será reduzido para manter a precisão decimal, embora o erro de estouro possa ser gerado.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.

Em operações de adição e de subtração, precisamos de max(p1 - s1, p2 - s2) casas para armazenar a parte integral do número decimal.In addition and subtraction operations, we need max(p1 - s1, p2 - s2) places to store integral part of the decimal number. Se não houver espaço suficiente para armazená-los, ou seja, max(p1 - s1, p2 - s2) < min(38, precision) - scale, a escala será reduzida para fornecer espaço suficiente para a parte integral.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. A escala resultante será MIN(precision, 38) - max(p1 - s1, p2 - s2), portanto, a parte fracionária poderá ser arredondada para se ajustar à escala resultante.Resulting scale is MIN(precision, 38) - max(p1 - s1, p2 - s2), so the fractional part might be rounded to fit into the resulting scale.

Em operações de multiplicação e divisão, precisamos de precision - scale casas para armazenar a parte integral do resultado.In multiplication and division operations, we need precision - scale places to store the integral part of the result. A escala pode ser reduzida usando as seguintes regras:The scale might be reduced using the following rules:

  1. A escala resultante será reduzida para min(scale, 38 - (precision-scale)) se a parte integral for menor que 32, pois ela não poderá ser maior que 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). Nesse caso, o resultado pode ser arredondado.Result might be rounded in this case.
  2. A escala não será alterada se for inferior a 6 e se a parte integral for maior que 32.The scale won't be changed if it's less than 6 and if the integral part is greater than 32. Nesse caso, o erro de estouro poderá ser gerado se ela não couber em decimal(38, scale)In this case, overflow error might be raised if it can't fit into decimal(38, scale)
  3. A escala será definida como 6 se for maior do que 6 e se a parte integral for maior do que 32.The scale will be set to 6 if it's greater than 6 and if the integral part is greater than 32. Nesse caso, tanto a parte integral quanto a escala seriam reduzidas e o tipo resultante seria decimal (38,6).In this case, both integral part and scale would be reduced and resulting type is decimal(38,6). O resultado poderá ser arredondado para até 6 casas decimais ou o erro de estouro será gerado se a parte integral não couber dentro dos 32 dígitos.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.

ExemplosExamples

A expressão a seguir retorna o resultado 0.00000090000000000 sem arredondamento, pois os resultados cabe em 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]

Neste caso, a precisão é de 61 e escala é de 40.In this case precision is 61, and scale is 40. A parte integral (escala de precisão = 21) é menor que 32, portanto, esse caso é o caso (1) nas regras de multiplicação e a escala é calculada como 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. O tipo de resultado é decimal(38,17).Result type is decimal(38,17).

A expressão a seguir retorna o resultado 0.000001 para caber em decimal(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)]

Neste caso, a precisão é de 61 e escala é de 20.In this case precision is 61, and scale is 20. A escala é maior do que 6 e a parte integral (precision-scale = 41) é maior do que 32.Scale is greater than 6 and integral part (precision-scale = 41) is greater than 32. Esse caso é o caso (3) nas regras de multiplicação e o tipo de resultado é decimal(38,6).This case is case (3) in multiplication rules and result type is decimal(38,6).

Confira tambémSee also

Expressões (Transact-SQL)Expressions (Transact-SQL)
Tipos de dados (Transact-SQL)Data Types (Transact-SQL)