decimal и numeric (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в базе данных Microsoft Fabric SQL в Microsoft Fabric
десятичные и числовые типы данных имеют фиксированную точность и масштаб. десятичные и числовые являются синонимами и могут использоваться взаимозаменяемо.
Аргументы
decimal [ ( p [ , s ] и числовые [ ( p [ , s ] ] ]
Числа с фиксированной точностью и масштабом. Если используется максимальная точность, допустимые значения находятся в -10^38 + 1
диапазоне 10^38 - 1
. Синонимы ISO для десятичного разряда : dec и dec(p,s). Тип numeric функционально эквивалентен типу decimal.
p (точность)
Максимальное общее число хранимых десятичных разрядов. Это число включает символы слева и справа от десятичной запятой. Точность должна быть значением в диапазоне от 1 до максимум 38. Точность по умолчанию составляет 18.
Примечание.
В Informatica поддерживаются только 16 значащих разрядов независимо от указанных точности и масштаба.
s (масштаб)
Максимальное число хранимых десятичных разрядов справа от десятичной запятой. Это число отнимается от p для определения максимального количества цифр слева от десятичной запятой. Масштаб должен иметь значение от 0 до p и может быть указан только при заданной точности. Масштаб по умолчанию — 0
и поэтому 0 <= s <= p
. Максимальный размер хранилища зависит от точности.
Точность | Байты хранилища |
---|---|
1–9 | 5 |
10–19 | 9 |
20–28 | 13 |
29–38 | 17 |
Примечание.
В Informatica (при подключении с помощью соединителя SQL Server PDW для Informatica) поддерживаются только 16 значащих разрядов независимо от указанных точности и масштаба.
Преобразование десятичных и числовых данных
Для типов данных decimal и numeric SQL Server обрабатывает каждое сочетание точности и масштаба как отдельный тип данных. Например, значения decimal(5,5) и decimal(5,0) считаются разными типами данных.
В инструкциях Transact-SQL константа с десятичным разделителем автоматически преобразуется в значение типа numeric с минимальными необходимыми значениями точности и масштаба. Например, константа 12.345
преобразуется в числовое значение с точностью 5
и масштабом 3
.
Допустимо ли преобразование из | Преобразование в | Риск преобразования |
---|---|---|
decimal и numeric | float или real | Возможная потеря точности |
int, smallint, tinyint, float, real, money или smallmoney | decimal и numeric | Возможный переполнение |
По умолчанию SQL Server использует округление с потерей точности и масштаба при преобразовании числа в значение decimal или numeric. И наоборот, если этот SET ARITHABORT
параметр установлен ON
, SQL Server вызывает ошибку при возникновении переполнения. Для возникновения ошибки недостаточно только потери точности и масштаба.
До SQL Server 2016 (13.x) преобразование значений с плавающей запятой в десятичное или числовое ограничено только значениями точности 17 цифр. Любое значение с плавающей запятой меньше 5E-18
(при установке с использованием научной 5E-18
нотации или десятичной нотации 0.000000000000000005
) округляется до 0
. Это ограничение не отображается в SQL Server 2016 (13.x) и более поздних версиях.
Примеры
В приведенном ниже примере создается таблица, в которой используются типы данных decimal и numeric. Значения вставляются в каждый столбец. Результаты возвращаются с помощью инструкции SELECT
.
CREATE TABLE dbo.MyTable (
MyDecimalColumn DECIMAL(5, 2),
MyNumericColumn NUMERIC(10, 5)
);
GO
INSERT INTO dbo.MyTable
VALUES (123, 12345.12);
GO
SELECT MyDecimalColumn, MyNumericColumn
FROM dbo.MyTable;
Вот результирующий набор.
MyDecimalColumn MyNumericColumn
---------------- ----------------
123.00 12345.12000