Skip to main content

Data Types

General-Purpose Data Types​

The table below shows all the built-in general-purpose data types. The alternatives listed in the aliases column can be used to refer to these types as well, however, note that the aliases are not part of the SQL standard and hence might not be accepted by other database engines.

SMALLSERIAL, SERIAL and BIGSERIAL are not aliases: each declares the corresponding integer type, attaches a sequence to the column, makes it NOT NULL and defaults it to the next value of that sequence.

NameAliasesDescription
BIGINTINT8, LONG, INT64, OIDSigned eight-byte integer
BIGNUMVARINTVariable-length integer
BITBITSTRINGString of 1s and 0s
BLOBBYTEA, BINARY, VARBINARYVariable-length binary data
BOOLEANBOOL, LOGICALLogical Boolean (true / false)
DATECalendar date (year, month, day)
DECIMAL(prec, scale)NUMERIC(prec, scale), DEC(prec, scale)Fixed-precision number with the given width (precision) and scale, defaults to prec = 18 and scale = 3
DOUBLEFLOAT8Double precision floating-point number (8 bytes)
ENUMDictionary-encoded set of named values, declared with CREATE TYPE
FLOATFLOAT4, REALSingle precision floating-point number (4 bytes)
GEOMETRYPlanar geometry with an optional coordinate reference system, see Geometry
HUGEINTINT128Signed sixteen-byte integer
INETIPv4 or IPv6 host address with an optional netmask
INTEGERINT4, INT, SIGNED, INT32Signed four-byte integer
INTERVALDate / time delta
JSONJSON object
SMALLINTINT2, SHORT, INT16Signed two-byte integer
TIMETime of day (no time zone)
TIME WITH TIME ZONETIMETZTime of day with a UTC offset
TIME_NSTime of day with nanosecond precision
TIMESTAMPDATETIME, TIMESTAMP_USCombination of time and date
TIMESTAMP WITH TIME ZONETIMESTAMPTZ, TIME_STAMPCombination of time and date that uses the current time zone
TIMESTAMP_MSTimestamp with millisecond precision
TIMESTAMP_NSTimestamp with nanosecond precision
TIMESTAMP_STimestamp with second precision
TIMESTAMPTZ_NSTimestamp with a UTC offset and nanosecond precision
TINYINTINT1Signed one-byte integer
TSQUERYParsed full-text query, see Full-Text Search Functions
UBIGINTUINT64Unsigned eight-byte integer
UHUGEINTUINT128Unsigned sixteen-byte integer
UINTEGERUINT32Unsigned four-byte integer
USMALLINTUINT16Unsigned two-byte integer
UTINYINTUINT8Unsigned one-byte integer
UUIDGUIDUUID data type
VARCHARCHAR, BPCHAR, TEXT, STRING, NVARCHARVariable-length character string

Implicit and explicit typecasting is possible between numerous types, see the Typecasting page for details.

Nested / Composite Types​

SereneDB supports six nested data types: ARRAY, LIST, MAP, STRUCT, TUPLE and UNION. Each supports different use cases and has a different structure.

NameDescriptionRules when used in a columnBuild from valuesDefine in DDL/CREATE
ARRAYAn ordered, fixed-length sequence of data values of the same type.Each row must have the same data type within each instance of the ARRAY and the same number of elements.[1, 2, 3]INTEGER[3]
LISTAn ordered sequence of data values of the same type.Each row must have the same data type within each instance of the LIST, but can have any number of elements.[1, 2, 3]INTEGER[]
MAPA dictionary of multiple named values, each key having the same type and each value having the same type. Keys and values can be any type and can be different types from one another.Rows may have different keys.map([1, 2], ['a', 'b'])MAP(INTEGER, VARCHAR)
STRUCTA dictionary of multiple named values, where each key is a string, but the value can be a different type for each key.Each row must have the same keys.{'i': 42, 'j': 'a'}STRUCT(i INTEGER, j VARCHAR)
TUPLEAn ordered sequence of values without names, where each value can have a different type.Each row must have the same number of values, with the same type at each position.row(1, 'a')TUPLE(INTEGER, VARCHAR)
UNIONA union of multiple alternative data types, storing one of them in each value at a time. A union also contains a discriminator “tag” value to inspect and access the currently set member type.Rows may be set to different member types of the union.union_value(num := 2)UNION(num INTEGER, text VARCHAR)
VARIANTA semi-structured type where each value is self-contained with its own type information.Each row may hold a value of a different type.42::VARIANTVARIANT

Rules for Case Sensitivity​

The keys of MAPs are case-sensitive, while keys of UNIONs and STRUCTs are case-insensitive. For examples, see the Rules for Case Sensitivity section.

Updating Values of Nested Types​

When performing updates on values of nested types, SereneDB performs a delete operation followed by an insert operation. When used in a table with ART indexes (either via explicit indexes or primary keys/unique constraints), this can lead to unexpected constraint violations.

Nesting​

ARRAY, LIST, MAP, STRUCT, TUPLE and UNION types can be arbitrarily nested to any depth, so long as the type rules are observed.

Struct with LISTs:

SQL
SELECT {'birds': ['duck', 'goose', 'heron'], 'aliens': NULL, 'amphibians': ['frog', 'toad']};
 struct_pack
---------------------------------------
 ("{duck,goose,heron}",,"{frog,toad}")

MAP with LIST values:

SQL
SELECT MAP(['a', 'b'], [[1, 2], [3, 4]]);
 map
---------------------------------------
 {"(a,\\"{1,2}\\")","(b,\\"{3,4}\\")"}

A list of STRUCTs:

SQL
SELECT [{'a': 1, 'b': 'x'}, {'a': 2, 'b': 'y'}];
 list_value
-------------------
 {"(1,x)","(2,y)"}

Performance Implications​

The choice of data types can have a strong effect on performance. Please consult the Performance Guide for details.