
- •Типы данных sql
- •Tочные числовые типы
- •Истинно целые типы
- •Точные типы, допускающие наличие дробной части
- •Приближенные числовые типы
- •Типы символьных строк
- •Типы битовых строк
- •Типы даты и времени
- •Тип даты
- •Типы времени
- •Типы временной метки
- •Типы времени и временной метки с временной зоной
- •Типы временных интервалов
- •Булевский тип
- •Типы коллекций
- •Типы массивов
- •Типы мультимножеств
- •Анонимные строчные типы
- •Типы, определяемые пользователем
- •Ссылочные типы
- •Типы данных PostgreSql 8.4.2
- •8.1. Числовые типы
- •8.1.1. Целочисленные типы
- •8.1.2. Числа с заданной точностью
- •8.1.3. Типы с плавающей точкой
- •8.1.4. Серийные типы
- •8.2. Денежные типы
- •8.3. Символьные типы
- •8.4. Двоичные типы данных
- •8.5. Типы дата/времени
- •8.5.6. Некоторые подробности по датам
- •8.6. Логический тип
- •8.7. Перечисления
- •8.8. Геометрические типы
- •8.9. Типы сетевых адресов
- •8.10. Типы битовых строк
- •8.11. Типы текстового поиска
- •8.11.1. Tsvector
- •8.11.2. Tsquery
- •8.12. Тип uuid
- •8.13. Тип xml
8.1.1. Целочисленные типы
Типы smallint, integer и bigint хранят обыкновенные числа, т.е. числа без дробной части, но разных диапазонов. Попытки сохранить значения, которые выходят за рамки разрешённого диапазона приведут к ошибке.
Обычно для целых чисел выбирается integer, потому что он предлагает лучший баланс между диапазоном хранимых значений, размером хранимых значений и производительностью. Тип smallint обычно используется только в случаях, когда необходимо крайне рациональное использование дискового пространства. Тип bigint должен использоваться только если не хватает диапазона типа integer, потому что работа с последним осуществляется существенно быстрее.
Только в некоторых операционных системах тип bigint может функционировать неправильно, так как он зависит от поддержки компилятором восьмибайтовых целых чисел. На машинах, где такой поддержки нет, bigint работает также как integer, но по прежнему использует восемь байт для хранения. (Мы не беспокоимся, что это будет происзодить на каких-либо современных платформах.)
SQL определяет только целочисленные типы integer (или int), smallint и bigint. Имена типов int2, int4 и int8 являются расширениями, которые также используются некоторыми другими SQL СУБД.
8.1.2. Числа с заданной точностью
Тип данных numeric может хранить числа с точностью до 1000 знаков после точки и с этим типом могут выполняться точные вычисления. Использование этого типа собенно рекомендуется для хранения денежных значений и других величин, для которых требуется точность. Однако, для типа numeric, работа с арифметическими значениями осуществляется очень медленно по сравнению с целочисленными типами или типами с плавающей точкой, о которых рассказывается в следущем разделе.
Далее используются следующие термины: масштаб(scale) типа numeric — это количество десятичных разрядов в дробной части, справа от десятичной точки. Точность (precision) типа numeric — это общее количество значимых разрядов во всём числе, т.е. количество разрядов по обе стороны от десятичной точки. Таким образом, число 23.5141 имеет точность 6 и масштаб 4. Целые числа могут быть представлены с использованием масштаба ноль.
Для колонки с типом numeric можно настроить и максимальную точность и максимальный масштаб. Для определения колонки типа numeric используйте синтаксис:
NUMERIC(точность, масштаб)
Точность должна быть положительным значением, масштаб должен быть либо положительным значением либо нулём. Можно также использовать и такой синтаксис:
NUMERIC(точность)
который обусловливает значение масштаба 0. Если задать:
NUMERIC
без значений точности и масштаба, будет создана колонка, в которой можно хранить значения типа numeric с любыми точностью и масштабом, ограниченными только реализованным в СУБД пределом точности. Колонка такого вида будет приводить вводимые значения к любому отдельному масштабу, в то время как колонки типа numeric с заданным значением масштаба будут приводить вводимые значениям к этому масштабу. (Стандарт SQL требует установки по умолчанию масштаба 0, т.е. приведение к целому числу. Мы находим это несколько бесполезным. Если вас заботит переносимость, всегда явно указывайте точность и масштаб).
Если масштаб какого-либо значения больше, чем заявленный масштаб колонки, то система округлит это значение до указанного количества дробных разрядов. Затем, если количество разрядов слева от десятичной точки превышает заявленную точность минус заявленный масштаб, будет выдано сообщение об ошибке.
Значения numeric физически хранятся без каких-либо дополнительных нулей вначале или в конце. Следовательно, заявленная точность и масштаб колонки являются максимально возможными, но размер хранения для них выделяется нефиксированный. (В этом смысле тип numeric больше похож на тип varchar(n), чем на тип char(n).) Фактически требования, предъявляемые к хранению — это два байта для каждой группы из четырёх десятичных разрядов, плюс дополнительно от пяти до восьми байт.
В дополнение к обычным числовым значениям, тип numeric позволяет хранить специальное значение NaN, которое означает "not-a-number (не число)". Любые операции над NaN в качестве результата дают другое значение NaN. Когда это значение пищется как константа в команде SQL, вы должны заключить его в одинарные кавычки, например UPDATE table SET x = 'NaN'. При вводе, строка NaN разпознаётся независимо от регистра букв.
Note: В большинстве реализаций концепции "не число", NaN не считается равным какому либо числовому значению (включая NaN). Чтобы разрешить сортировку значениям numeric и использовать индексы, основанные на деревьях, PostgreSQL считает значения NaN равными или больше, чем все не-NaN значения.
Типы decimal и numeric эквивалентны. Оба типа являются частью стандарта SQL.