Иллюстрированный самоучитель по PostgreSQL

Числовые типы

В отличие от вещественных типов данных, при попытке вставить в поле numeriс число, не входящее в интервал допустимых значений, происходит ошибка переполнения. В остальном допускается вставка любого числа, не нарушающего заданной точности.

Например, в поле numeric(11.6) можно безопасно сохранить значение 9.99999999 с лишними цифрами в дробной части (хотя оно будет округлено до 10.000000). С другой стороны, как видно из листинга 3.22, попытка сохранения числа 99999.99999999 завершается неудачей.

Проблемы, возникающие при вставке слишком длинных чисел, можно легко обойти. Для этого в команду INSERT включается функция trunc(), усекающая число по размерам поля. При вызове функции передается требуемое количество позиций, поэтому вы должны знать, с какими параметрами определялось поле. Применение функции trunc() продемонстрировано в листинге 3.22.

Листинг 3.22. Предотвращение ошибок переполнения.

booktcwn=# INSERT INTO numbers
VALUES (9.99999999);
INSERT 3390697 1
booktown=# SELECT * FROM numbers:
number
10.000000 (1 row)
booktown=# INSERT INTO
numbers VALUES (9999.99999999);
ERROR: overflow on numeric
AMS(value) >= 10*5 for field with precision
11 scale 6 booktown=# INSERT INTO
numbers VALUES (trunc(99999.99999999.6));
INSERT 3390698 1
booktown=# SELECT * FROM
numbers; number
10.000000 99999.999999 (2 rows)
booktown=# INSERT INTO
numbers VALUES (trunc0.99999999. 6));
INSERT 3390699 1
booktown=# SELECT * FROM numbers;
number
10.000000 99999.999999 9.999999
(3 rows)

Тип money

Тип money предназначен для хранения денежных величин и обычных чисел. На момент написания книги тип money считается устаревшим и использовать его не рекомендуется. В книге он представлен лишь как один из действующих типов, который все еще может встречаться в существующих системах PostgreSQL.

Вместо типа money следует использовать тип numeric с масштабом 2 и точностью, достаточной для представления максимальной необходимой величины (включая две цифры для дробной части). Форматирование, аналогичное типу money, выполняется при помощи функции to_char(), используемой в листинге 3.23. В этом примере продемонстрирован оператор конкатенации и функция форматирования текста ltrim(), о которых рассказано в главе 4.

Листинг 3.23. Использование типа numeric вместо money.

booktown=# CREATE TABLE money_example (money_cash money.
booktown(# numeric_cash numeric(10.2)):
CREATE
booktown=# INSERT INTO money_example VALUES C$12.241, 12.24);
INSERT 3391095 1
booktown=# SELECT * FROM money_example;
money_cash | numeric_cash
$12.24 | 12.24 (1 row)
booktown=# SELECT money_cash,
booktown-# '$' | ltrim(to_char(numenc_cash. '9999.99'))
booktown-# AS numeric_cashif1ed
booktown-# FROM money_example;
money_cash | numeric_cashified
$12.24 j 12.24
(1 row)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.