Spec-Zone.ru › DuckDB

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

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

Типы TINYINT, SMALLINT, INTEGER, BIGINT и HUGEINT хранят целые числа, то есть числа без дробной части, различных диапазонов. Попытки сохранить значения, выходящие за пределы допустимого диапазона, приведут к ошибке. Типы UTINYINT, USMALLINT, UINTEGER, UBIGINT и UHUGEINT хранят целые беззнаковые числа. Попытки сохранить отрицательные числа или значения, выходящие за пределы допустимого диапазона, приведут к ошибке.

Имя Псевдонимы Мин Макс
TINYINT INT1 -128 127
SMALLINT INT2, INT16 SHORT -32768 32767
INTEGER INT4, INT32, INT, SIGNED -2147483648 2147483647
BIGINT INT8, INT64 LONG -9223372036854775808 9223372036854775807
HUGEINT INT128 -170141183460469231731687303715884105728 170141183460469231731687303715884105727
UTINYINT - 0 255
USMALLINT - 0 65535
UINTEGER - 0 4294967295
UBIGINT - 0 18446744073709551615
UHUGEINT - 0 340282366920938463463374607431768211455

Тип integer является предпочтительным выбором, так как он обеспечивает наилучший баланс между диапазоном, размером хранилища и производительностью. Тип SMALLINT обычно используется только в случае ограниченного места на диске. Типы BIGINT и HUGEINT предназначены для использования в случае недостаточного диапазона целочисленного типа.

Десятичные дроби с фиксированной точкой

Тип данных DECIMAL(WIDTH, SCALE) (также доступен под псевдонимом NUMERIC(WIDTH, SCALE)) представляет собой точное десятичное значение с фиксированной точкой. При создании значения типа DECIMAL, можно указать WIDTH и SCALE, чтобы определить размер десятичных значений, которые могут храниться в поле. Поле WIDTH определяет количество значащих цифр, а поле scale определяет количество цифр после запятой. Например, тип DECIMAL(3, 2) может вместить значение 1.23, но не может вместить значение 12.3 или значение 1.234. По умолчанию WIDTH и SCALE равно DECIMAL(18, 3), если не указано иное.

Внутренне десятичные значения представлены целыми числами, в зависимости от их указанного WIDTH.

Ширина Внутреннее Размер (байты)
1-4 INT16 2
5-9 INT32 4
10-18 INT64 8
19-38 INT128 16

Производительность может пострадать от использования слишком больших десятичных значений, когда это не требуется. В частности, десятичные значения с шириной выше 19 медленные, так как арифметические операции с типом INT128 намного дороже, чем операции с типами INT32 или INT64. Поэтому рекомендуется использовать ширину WIDTH 18 или ниже, если нет веских причин, по которым этого недостаточно.

Типы с плавающей точкой

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

Имя Псевдонимы Описание
FLOAT FLOAT4, REAL число с плавающей точкой одинарной точности (4 байта)
DOUBLE FLOAT8 число с плавающей точкой двойной точности (8 байт)

Как и для типов данных с фиксированной точкой, преобразование из литералов или приведение типов к типам с плавающей точкой хранит вводимые данные, которые не могут быть точно представлены, как приближения. Однако предсказать, какие входные данные затронуты этим, может быть сложнее. Например, неудивительно, что 1.3::DECIMAL(1, 0) - 0.7::DECIMAL(1, 0) != 0.6::DECIMAL(1, 0), но может быть неожиданно, что 1.3::FLOAT - 0.7::FLOAT != 0.6::FLOAT.

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

Однако для более сложных математических операций используется арифметика с плавающей точкой, и более точные результаты могут быть получены, если промежуточные шаги не приводятся к форматам с фиксированной точкой той же ширины, что и входные и выходные данные. Например, (10::FLOAT / 3::FLOAT)::FLOAT * 3 = 10 тогда как (10::DECIMAL(18, 3) / 3::DECIMAL(18, 3))::DECIMAL(18, 3) * 3 = 9.999.

В общем, мы рекомендуем:

  • Если вам требуется точное хранение чисел с известным количеством десятичных знаков и точные сложения, вычитания и умножения (например, для денежных сумм), используйте тип данных DECIMAL или его псевдоним NUMERIC.
  • Если вы хотите выполнять быстрые или сложные вычисления, типы данных с плавающей точкой могут быть более подходящими. Однако, если вы используете результаты для чего-то важного, вы должны тщательно оценить свою реализацию на предмет особых случаев (диапазоны, бесконечности, переполнения, недопустимые операции), которые могут обрабатываться иначе, чем вы ожидаете, и вы должны ознакомиться с распространёнными ловушками арифметики с плавающей точкой. Статья “What Every Computer Scientist Should Know About Floating-Point Arithmetic” by David Goldberg и последовательность статей о плавающей точке на блоге Брюса Доусона являются отличными отправными точками.

На большинстве платформ тип FLOAT имеет диапазон не менее 1E-37 до 1E+37 с точностью не менее 6 десятичных знаков. Тип DOUBLE обычно имеет диапазон около 1E-307 до 1E+308 с точностью не менее 15 знаков. Положительные числа за пределами этих диапазонов (и отрицательные числа за пределами зеркальных диапазонов) могут вызвать ошибки на некоторых платформах, но обычно будут преобразованы в ноль или бесконечность соответственно.

В дополнение к обычным числовым значениям типы с плавающей точкой имеют несколько специальных значений, представляющих специальные значения IEEE 754:

  • Infinity: бесконечность
  • -Infinity: минус бесконечность
  • NaN: не число

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

При написании этих значений в качестве констант в команде SQL, вы должны заключить их в кавычки, например:

UPDATE table
SET x = '-Infinity';

При вводе эти строки распознаются без учёта регистра.

Универсально уникальные идентификаторы (UUID)

DuckDB поддерживает универсально уникальные идентификаторы (UUID) через тип UUID. Они используют 128 бит и представляются внутри как значения HUGEINT. При выводе они отображаются с помощью строчных шестнадцатеричных символов, разделенных дефисами следующим образом: ⟨8 characters⟩-⟨4 characters⟩-⟨4 characters⟩-⟨4 characters⟩-⟨12 characters⟩ (используя 36 символов в общей сложности, включая дефисы). Например, 4ac7a9e9-607c-4c8a-84f3-843f0191e3fd — это допустимый UUID.

Для генерации нового UUID используйте uuid().

Функции

См. Числовые функции и операторы.

© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/data_types/numeric.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API