Числовые типы
Целочисленные типы
Типы 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