Числовые типы включают двух-, четырёх- и восьмибайтные целые, четырёх- и восьмибайтные числа с плавающей точкой, а также десятичные числа с задаваемой точностью. 

ИмяРазмерОписаниеДиапазон
smallint2 байтацелое в небольшом
диапазоне
-32768 .. +32767
integer4 байтатипичный выбор для
целых чисел
-2147483648 ..
+2147483647
bigint8 байтцелое в большом
диапазоне
-9223372036854775808 ..
9223372036854775807
decimalпеременныйвещественное число с
указанной точностью
до 131072 цифр до
десятичной точки и до
16383 — после
numericпеременныйвещественное число с
указанной точностью
до 131072 цифр до
десятичной точки и до
16383 — после
real4 байтавещественное число с
переменной точностью
точность в пределах 6
десятичных цифр
double precision8 байтвещественное число с
переменной точностью
точность в пределах 15
десятичных цифр
smallserial2 байтанебольшое целое с
автоувеличением
1 .. 32767
serial4 байтацелое с
автоувеличением
1 .. 2147483647
bigserial8 байтбольшое целое с
автоувеличением
1 ..
9223372036854775807

Для этих типов определён полный набор соответствующих арифметических операторов и функций.

Целочисленные типы

Типы smallint, integer и bigint хранят целые числа, то есть числа без дробной части, имеющие разные допустимые диапазоны. Попытка сохранить значение, выходящее за рамки диапазона, приведёт к ошибке.

Чаще всего используется тип integer, как наиболее сбалансированный выбор ширины диапазона, размера и быстродействия. Тип smallint обычно применяется, только когда крайне важно уменьшить размер данных на диске. Тип bigint предназначен для тех случаев, когда числа не умещаются в диапазон типа integer. В SQL определены только типы integer (или int), smallint и bigint. Имена типов int2, int4 и int8 выходят за рамки стандарта, хотя могут работать и в некоторых других СУБД.

Числа с произвольной точностью

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

Ниже мы используем следующие термины: Точность a numeric— это общее количество значащих цифр в целом числе, то есть количество цифр по обе стороны от десятичной точки. Масштаб а - это numericколичество десятичных цифр в дробной части справа от десятичной точки. Таким образом, число 23,5141 имеет точность 6 и масштаб 4. Можно считать, что целые числа имеют нулевой масштаб.

numericМожно настроить как максимальную точность, так и максимальный масштаб столбца. Чтобы объявить столбец типа, numericиспользуйте синтаксис:

NUMERIC(precision, scale)

Точность должна быть положительной, шкала нулевой или положительной. В качестве альтернативы:

NUMERIC(precision)

выбирает масштаб 0. Указание:

NUMERIC

без какой-либо точности или масштаба создает « неограниченный числовой » столбец, в котором могут храниться числовые значения любой длины, вплоть до ограничений реализации. Столбец такого типа не будет приводить входные значения к какому-либо конкретному масштабу, тогда как numericстолбцы с объявленным масштабом будут приводить входные значения к этому масштабу. (Стандарт SQL требует шкалы по умолчанию, равной 0, т. е. приведения к целочисленной точности. Мы находим это немного бесполезным. Если вас беспокоит переносимость, всегда указывайте точность и масштаб явно.)

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

Числовые значения физически хранятся без каких-либо дополнительных нулей в начале или в конце. Таким образом, заявленная точность и масштаб столбца являются максимальными, а не фиксированными выделениями. (В этом смысле numericтип больше похож на , чем на .) Фактическое требование к памяти составляет два байта для каждой группы из четырех десятичных цифр плюс от трех до восьми байтов служебных данных.varchar(n)char(n)

Помимо обычных числовых значений, numericтип имеет несколько специальных значений:
Infinity
-Infinity
NaN

Они адаптированы из стандарта IEEE 754 и представляют « бесконечность » , « отрицательную бесконечность » и « не-число » соответственно. Записывая эти значения как константы в команде SQL, вы должны заключать их в кавычки, например UPDATE table SET x = '-Infinity'. При вводе эти строки распознаются без учета регистра. В качестве альтернативы значения бесконечности могут быть записаны infи -inf.

Значения бесконечности ведут себя в соответствии с математическими ожиданиями. Например, Infinityплюс любое конечное значение равно Infinity, как и Infinityплюс Infinity; но Infinityминус Infinityдает NaN(не число), потому что у него нет четкой интерпретации. Обратите внимание, что бесконечность может храниться только в неограниченном numericстолбце, потому что теоретически она превышает любой конечный предел точности.

Значение NaN(не число) используется для представления неопределенных результатов вычислений. В общем, любая операция с NaNвходом дает другой NaN. Единственным исключением является случай, когда другие входные данные операции таковы, что тот же результат был бы получен, если NaNбы их заменили любым конечным или бесконечным числовым значением; затем это выходное значение также используется NaN. (Примером этого принципа является то, что NaNвозведение в нулевую степень дает единицу.)

Типы decimalи numericэквивалентны. Оба типа являются частью стандарта SQL .

При округлении значений numericтип округляет связи от нуля, в то время как (на большинстве машин) тип realи округляет связи double precisionдо ближайшего четного числа. Например:

SELECT x,
  round(x::numeric) AS num_round,
  round(x::double precision) AS dbl_round
FROM generate_series(-3.5, 3.5, 1) as x;
  x   | num_round | dbl_round
------+-----------+-----------
 -3.5 |        -4 |        -4
 -2.5 |        -3 |        -2
 -1.5 |        -2 |        -2
 -0.5 |        -1 |        -0
  0.5 |         1 |         0
  1.5 |         2 |         2
  2.5 |         3 |         2
  3.5 |         4 |         4
(8 rows)

Типы с плавающей запятой

Типы данных realи double precisionявляются неточными числовыми типами переменной точности. На всех поддерживаемых в настоящее время платформах эти типы являются реализациями стандарта IEEE 754 для двоичных арифметических операций с плавающей запятой (одинарной и двойной точности соответственно) в той мере, в какой их поддерживают базовый процессор, операционная система и компилятор.

Неточный означает, что некоторые значения не могут быть точно преобразованы во внутренний формат и сохраняются как приблизительные значения, поэтому при сохранении и извлечении значения могут быть обнаружены небольшие расхождения. Управление этими ошибками и то, как они распространяются в вычислениях, является предметом целой отрасли математики и информатики и здесь не будет обсуждаться, за исключением следующих моментов:

  • Если вам требуется точное хранение и расчеты (например, для денежных сумм), используйте numericвместо этого тип.
  • Если вы хотите выполнять сложные вычисления с этими типами для чего-то важного, особенно если вы полагаетесь на определенное поведение в граничных случаях (бесконечность, потеря значимости), вам следует тщательно оценить реализацию.
  • Сравнение двух значений с плавающей запятой на равенство может не всегда работать должным образом.

На всех поддерживаемых в настоящее время платформах этот realтип имеет диапазон от 1E-37 до 1E+37 с точностью не менее 6 знаков после запятой. Тип double precisionимеет диапазон от 1E-307 до 1E+308 с точностью не менее 15 цифр. Слишком большие или слишком маленькие значения вызовут ошибку. Округление может иметь место, если точность входного числа слишком высока. Слишком близкие к нулю числа, которые не могут быть представлены как отличные от нуля, вызовут ошибку потери значимости.

По умолчанию значения с плавающей запятой выводятся в текстовом виде в кратчайшем точном десятичном представлении; полученное десятичное значение ближе к истинному сохраненному двоичному значению, чем к любому другому значению, представленному с той же двоичной точностью. (Однако выходное значение в настоящее время никогда не находится точно посередине между двумя представляемыми значениями, чтобы избежать широко распространенной ошибки, когда процедуры ввода не соблюдают должным образом правило округления до ближайшего четного.) Это значение будет использовать не более 17 значащих десятичных знаков. цифры для float8значений и не более 9 цифр для float4значений.

Для совместимости с выводом, генерируемым более старыми версиями PostgreSQL , и для снижения точности вывода можно использовать параметр extra_float_digits для выбора округленного десятичного вывода. Установка значения 0 восстанавливает предыдущее значение по умолчанию для округления значения до 6 (для float4) или 15 (для float8) значащих десятичных цифр. Установка отрицательного значения еще больше уменьшает количество цифр; например -2 будет округлять вывод до 4 или 13 цифр соответственно.

Любое значение extra_float_digits больше 0 выбирает самый короткий и точный формат.

В дополнение к обычным числовым значениям типы с плавающей запятой имеют несколько специальных значений:
Infinity
-Infinity
NaN

Они представляют специальные значения IEEE 754 « бесконечность » , « отрицательная бесконечность » и « не число » соответственно. Записывая эти значения как константы в команде SQL, вы должны заключать их в кавычки, например UPDATE table SET x = '-Infinity'. При вводе эти строки распознаются без учета регистра. В качестве альтернативы значения бесконечности могут быть записаны infи -inf.

PostgreSQL также поддерживает нотации стандарта SQL floatи для указания неточных числовых типов. Здесь указывает минимальную приемлемую точность в двоичных цифрах. PostgreSQL принимает в качестве выбора типа, а для выбора . Значения вне допустимого диапазона рисуют ошибку. без указания точности считается означающим .float(p)pfloat(1)float(24)realfloat(25)float(53)double precisionpfloatdouble precision

Серийные типы

Типы данных и не являются истинными типами smallserial, а являются просто удобными обозначениями для создания столбцов уникальных идентификаторов (аналогично свойству, поддерживаемому некоторыми другими базами данных). В текущей реализации указание:serialbigserialAUTO_INCREMENT

CREATE TABLE tablename (
    colname SERIAL
);

эквивалентно указанию:

CREATE SEQUENCE tablename_colname_seq AS integer;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

Таким образом, мы создали целочисленный столбец и сделали так, чтобы его значения по умолчанию назначались из генератора последовательности. Ограничение NOT NULLприменяется, чтобы гарантировать, что нулевое значение не может быть вставлено. (В большинстве случаев вы также захотите добавить ограничение UNIQUEили PRIMARY KEY, чтобы предотвратить случайную вставку повторяющихся значений, но это не происходит автоматически.) Наконец, последовательность помечается как « принадлежит » столбцу, поэтому она будет удалена . если столбец или таблица удалены.

Чтобы вставить следующее значение последовательности в serialстолбец, укажите, что serialстолбцу должно быть присвоено значение по умолчанию. Это можно сделать либо путем исключения столбца из списка столбцов в INSERTвыписке, либо с помощью DEFAULTключевого слова.

Имена типов serialи serial4эквивалентны: оба создают integerстолбцы. Имена типов bigserialи serial8работают одинаково, за исключением того, что они создают bigintстолбец. bigserialследует использовать, если предполагается использование более 2 31 идентификаторов за время существования таблицы. Имена типов smallserialи serial2также работают одинаково, за исключением того, что они создают smallintстолбец.

Последовательность, созданная для serialстолбца, автоматически удаляется при удалении столбца-владельца. Вы можете удалить последовательность, не удаляя столбец, но это приведет к удалению выражения столбца по умолчанию.