⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Data Types

通用数据类型

下表显示了所有内置的通用数据类型。别名列中列出的替代项也可以用来引用这些类型,但请注意,别名不是SQL标准的一部分,因此可能不会被其他数据库引擎接受。

Name Aliases Description
BIGINT INT8, LONG 有符号的八字节整数
BIT BITSTRING 由1和0组成的字符串
BLOB BYTEA, BINARY, VARBINARY 可变长度的二进制数据
BOOLEAN BOOL, LOGICAL 逻辑布尔值(真/假)
DATE   日历日期(年,月,日)
DECIMAL(prec, scale) NUMERIC(prec, scale) 具有给定宽度(精度)和小数位数的固定精度数字,默认为 prec = 18scale = 3
DOUBLE FLOAT8, 双精度浮点数(8字节)
FLOAT FLOAT4, REAL 单精度浮点数(4字节)
HUGEINT   有符号的十六字节整数
INTEGER INT4, INT, SIGNED 有符号四字节整数
INTERVAL   日期/时间差
JSON   JSON 对象(通过 json 扩展
SMALLINT INT2, SHORT 有符号的两字节整数
TIME   一天中的时间(无时区)
TIMESTAMP WITH TIME ZONE TIMESTAMPTZ 使用当前时区的时间和日期的组合
TIMESTAMP DATETIME 时间和日期的组合
TINYINT INT1 有符号的一字节整数
UBIGINT   无符号八字节整数
UHUGEINT   无符号十六字节整数
UINTEGER   无符号四字节整数
USMALLINT   无符号两字节整数
UTINYINT   无符号单字节整数
UUID   UUID 数据类型
VARCHAR CHAR, BPCHAR, TEXT, STRING 可变长度字符串

隐式和显式类型转换在许多类型之间是可能的,详情请参阅类型转换页面。

嵌套 / 复合类型

DuckDB 支持五种嵌套数据类型:ARRAYLISTMAPSTRUCTUNION。每种类型支持不同的用例并具有不同的结构。

名称 描述 在列中使用时的规则 从值构建 在DDL/CREATE中定义
ARRAY 一个有序的、固定长度的相同类型数据值的序列。 每一行在ARRAY的每个实例中必须具有相同的数据类型和相同数量的元素。 [1, 2, 3] INTEGER[3]
LIST 相同类型数据值的有序序列。 每一行在LIST的每个实例中必须具有相同的数据类型,但可以有任意数量的元素。 [1, 2, 3] INTEGER[]
MAP 多个命名值的字典,每个键具有相同的类型,每个值也具有相同的类型。键和值可以是任何类型,并且可以彼此不同。 行可能具有不同的键。 map([1, 2], ['a', 'b']) MAP(INTEGER, VARCHAR)
STRUCT 多个命名值的字典,其中每个键是一个字符串,但每个键的值可以是不同的类型。 每一行必须具有相同的键。 {'i': 42, 'j': 'a'} STRUCT(i INTEGER, j VARCHAR)
UNION 多个替代数据类型的联合,每次在每个值中存储其中一个。联合还包含一个鉴别器“标签”值,用于检查和访问当前设置的成员类型。 行可以设置为联合的不同成员类型。 union_value(num := 2) UNION(num INTEGER, text VARCHAR)

更新嵌套类型的值

在对嵌套类型的值执行更新时,DuckDB会执行删除操作,然后执行插入操作。 在具有ART索引的表(通过显式索引或主键/唯一约束)中使用时,这可能会导致意外的约束冲突。 例如:

CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR);
INSERT INTO students VALUES (1, 'Student 1');

UPDATE tbl
    SET j = [2]
    WHERE i = 1;
Constraint Error: Duplicate key "i: 1" violates primary key constraint.
If this is an unexpected constraint violation please double check with the known index limitations section in our documentation (https://duckdb.org/docs/sql/indexes).

嵌套

ARRAY, LIST, MAP, STRUCT, 和 UNION 类型可以任意嵌套到任何深度,只要遵守类型规则。

包含LIST的结构体:

SELECT {'birds': ['duck', 'goose', 'heron'], 'aliens': NULL, 'amphibians': ['frog', 'toad']};

包含MAP列表的结构体:

SELECT {'test': [MAP([1, 5], [42.1, 45]), MAP([1, 5], [42.1, 45])]};

一个UNION的列表:

SELECT [union_value(num := 2), union_value(str := 'ABC')::UNION(str VARCHAR, num INTEGER)];

Performance Implications

数据类型的选择对性能有很大影响。详情请参阅性能指南

本节中的页面