Числовые типы
В отличие от вещественных типов данных, при попытке вставить в поле 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)