SQL-тип Decimal позволяет хранить числа с фиксированной точностью и масштабом. Он часто используется для денежных или измерительных величин.
Основы Decimal в SQL
Decimal - это тип данных в SQL, предназначенный для хранения чисел с фиксированной точностью и масштабом. Он гарантирует, что значения будут сохранены без потери точности, в отличие от типа с плавающей точкой, где возможны округления.
Определение Decimal
При объявлении столбца или переменной типа Decimal указываются два параметра:
- Точность (precision) - максимальное количество цифр, которое может быть сохранено
- Масштаб (scale) - максимальное количество цифр после запятой
Например, в записи DECIMAL(5, 2) точность равна 5, а масштаб - 2. Это означает, что можно сохранить число от -999.99 до 999.99.
Синтаксис объявления Decimal
Вот общий синтаксис для объявления Decimal:
DECIMAL(precision, scale)
Где:
- precision - общее количество цифр
- scale - количество цифр после запятой
Несколько примеров объявления Decimal с разными параметрами:
DECIMAL(10,5) - число от -99999.99999 до 99999.99999
DECIMAL(6) - число от -999999 до 999999 (scale по умолчанию 0)
DECIMAL(10) - то же, что и DECIMAL(10,0)
Допустимые значения precision и scale
В разных СУБД допустимые значения precision и scale отличаются:
СУБД | Макс. precision | Макс. scale |
SQL Server | 38 | precision |
Oracle | 38 | precision |
PostgreSQL | 1000 | 126 |
MySQL | 65 | 30 |
Как видно, PostgreSQL позволяет использовать очень большую точность, а в MySQL она ограничена.
Размер хранения данных Decimal
Для небольших значений precision размер хранения Decimal такой:
- До 9 цифр - 4 байта
- До 19 цифр - 8 байт
- До 28 цифр - 12 байт
- До 38 цифр - 16 байт
Как видим, чем выше точность, тем больше места занимает число при хранении. Поэтому важно указывать оптимальную для ваших данных точность.
Отличие DECIMAL и NUMERIC
В стандарте SQL эти типы немного отличаются:
- DECIMAL гарантирует масштаб, а точность может быть больше указанной
- NUMERIC гарантирует как масштаб, так и точность
На практике в большинстве СУБД DECIMAL и NUMERIC идентичны.
Преимущества Decimal
По сравнению с целыми числами и числами с плавающей точкой, Decimal имеет такие плюсы:
- Хранит точное значение с фиксированной точностью
- Не теряет в значимости для больших и маленьких чисел
- Удобен для денежных, процентных и других измерительных данных
Когда использовать Decimal?
Рекомендуется применять тип Decimal в таких случаях:
- Для хранения денежных или финансовых величин
- В измерительных или статистических данных, где важна точность
- Если нужно выполнять вычисления с фиксированной точностью
- Когда нельзя использовать приблизительные числа с плавающей точкой
Вместо Decimal лучше применять целые числа, когда нет необходимости в десятичных знаках и значения не очень велики. А для больших приблизительных значений подойдут числа с плавающей точкой.
Работа с Decimal в SQL
Рассмотрим основные операции при работе с данными типа Decimal в SQL на примерах.
Вставка данных в столбец Decimal
При вставке значений в столбец Decimal следует учитывать объявленную для него точность и масштаб. Например, для столбца DECIMAL(5,2):
INSERT INTO table (decimal_col) VALUES (123.45); -- OK
INSERT INTO table (decimal_col) VALUES (1234.56); -- Ошибка
Вторая команда вызовет ошибку, поскольку число 1234.56 превышает объявленную точность в 5 цифр.
Преобразование типов
Значения других типов можно явно привести к Decimal. Например:
SELECT CAST(float_col AS DECIMAL(10,2)) FROM table;
SELECT CONVERT(DECIMAL(10,2), int_col) FROM table;
CAST и CONVERT выполнят конвертацию в Decimal с нужной точностью и масштабом.
Округление десятичных знаков
Если при вставке указать число с большим масштабом, чем разрешено, произойдет округление:
INSERT INTO table (decimal_col) VALUES (123.456);
Для DECIMAL(5,2) будет вставлено значение 123.46.
Сравнение Decimal
"decimal sql" можно сравнивать как с Decimal, так и другими числовыми типами:
SELECT * FROM table WHERE decimal_col > int_col
SELECT * FROM table WHERE decimal_col = float_col
Сравнение выполняется по числовому значению после неявного приведения типов.
Применение Decimal
Рассмотрим использование типа данных SQL Decimal в различных ситуациях.
Хранение денежных сумм
"sql тип decimal" часто используется для представления денежных величин - зарплат, бюджетов, курсов валют. Гарантированная точность позволяет избежать ошибок округления.
Например, для хранения бюджетов подразделений можно использовать поле:
department_budget DECIMAL(11,2)
Это позволит хранить суммы от -99999.99 до 99999.99 с точностью до копеек.
Измерения и статистика
Для хранения результатов измерений Decimal подходит лучше float, так как имеет фиксированную точность. Например, учет показаний датчиков:
sensor_temperature DECIMAL(5,2)
Погрешность будет не более 0.01 градуса. А для статистики часто используют вот такие столбцы:
conversion_rate DECIMAL(5,4) mean_transaction_size DECIMAL(8,2)
Это позволяет более точно хранить процентные и измерительные данные.