Длина десятичного масштаба SQL Server - может быть или должно быть? - программирование
Подтвердить что ты не робот

Длина десятичного масштаба SQL Server - может быть или должно быть?

У меня действительно просто вопрос о типе DECIMAL (и, возможно, NUMERIC) в SQL Server 2008 R2.

MSDN сказал:

(шкала) Максимальное количество десятичных цифр, которое можно сохранить справа от десятичной точки. Масштаб должен быть значением от 0 до p.

Я понимаю это следующим образом:

  • Если у меня есть DECIMAL(10, 5) - я могу хранить 12345.12345 или 12345678.91.
  • если у меня есть DECIMAL(5, 5) - я могу иметь 12345 или 1234.5 или 1.2345 и т.д.

Ясно ли это?

Но я получил это сообщение об ошибке:

SELECT CAST(2.8514 AS DECIMAL(5,5))

Ошибка арифметического переполнения, преобразующая числовые данные в числовые данные.

Я думал, что 5,5 означает, что у меня может быть до 5 цифр и до 5 МОЖЕТ быть справа от десятичной точки.

Как я и пробовал:

SELECT CAST(12.851 AS DECIMAL(6,5)) - overflows too

однако

SELECT CAST(1.23456 AS DECIMAL(6,5)) - is OK.

Так какая правда?

DECIMAL(a,b) говорит, что у меня может быть до цифр, а JUST b из них правы до десятичной точки (а остальное a-b слева до точки dec)?

Я действительно смущен выражением в документе, который копируется повсюду. Пожалуйста, уделите время и объясните мне эту простую вещь.

Большое спасибо!

4b9b3361

Ответ 1

Самый простой способ подумать (для меня) заключается в том, что точность - это общее количество цифр, из которых масштаб - это число цифр справа от десятичной точки. Итак, DECIMAL(p,s) означает p-s цифры слева от точки, а s цифры справа от точки.

Это объясняет все ошибки преобразования, которые вы видите: 2.8514 не может быть decimal(5,5), потому что p-s = 0; 12.851 не может быть decimal(6,5), потому что p-s = 1 и т.д.