数据类型
通用数据类型
下表展示了所有内置的通用数据类型。别名列中的替代名称也可用于引用这些类型,但请注意,这些别名不是 SQL 标准的一部分,因此其他数据库引擎可能不接受。
| 名称 | 别名 | 描述 |
|---|---|---|
BIGINT | INT8, LONG | 有符号 8 字节整数 |
BIT | BITSTRING | 由 1 和 0 组成的字符串 |
BLOB | BYTEA, BINARY, VARBINARY | 可变长度二进制数据 |
BIGNUM | 可变长度整数 | |
BOOLEAN | BOOL, LOGICAL | 逻辑布尔值(true / false) |
DATE | 日历日期(年、月、日) | |
DECIMAL(prec, scale) | NUMERIC(prec, scale) | 指定宽度(precision)与小数位(scale)的定点数,默认 prec = 18、scale = 3 |
DOUBLE | FLOAT8, | 双精度浮点数(8 字节) |
FLOAT | FLOAT4, REAL | 单精度浮点数(4 字节) |
HUGEINT | 有符号 16 字节整数 | |
INTEGER | INT4, INT, SIGNED | 有符号 4 字节整数 |
INTERVAL | 日期/时间差值 | |
JSON | JSON 对象(通过 json 扩展) | |
SMALLINT | INT2, SHORT | 有符号 2 字节整数 |
TIME | 一天中的时间(无时区) | |
TIMESTAMP WITH TIME ZONE | TIMESTAMPTZ | 使用当前时区的日期与时间组合 |
TIMESTAMP | DATETIME | 日期与时间组合 |
TINYINT | INT1 | 有符号 1 字节整数 |
UBIGINT | 无符号 8 字节整数 | |
UHUGEINT | 无符号 16 字节整数 | |
UINTEGER | 无符号 4 字节整数 | |
USMALLINT | 无符号 2 字节整数 | |
UTINYINT | 无符号 1 字节整数 | |
UUID | UUID 数据类型 | |
VARCHAR | CHAR, BPCHAR, TEXT, STRING | 可变长度字符串 |
许多类型之间支持隐式与显式类型转换,详见 Typecasting 页面。
嵌套/复合类型
Goose 支持五种嵌套数据类型:ARRAY、LIST、MAP、STRUCT 和 UNION。它们适用于不同场景,结构也各不相同。
| 名称 | 描述 | 作为列使用时的规则 | 由值构造 | 在 DDL/CREATE 中定义 |
|---|---|---|---|---|
ARRAY | 同一类型数据值构成的有序定长序列。 | 每行中每个 ARRAY 实例都必须是相同数据类型且元素个数一致。 | [1, 2, 3] | INTEGER[3] |
LIST | 同一类型数据值构成的有序序列。 | 每行中每个 LIST 实例都必须是相同数据类型,但元素个数可不同。 | [1, 2, 3] | INTEGER[] |
MAP | 由多个命名值组成的字典,所有 key 类型相同、所有 value 类型相同。key 和 value 可为任意类型,且两者之间可不同。 | 各行可有不同 key。 | map([1, 2], ['a', 'b']) | MAP(INTEGER, VARCHAR) |
STRUCT | 由多个命名值组成的字典,其中每个 key 是字符串,但每个 key 对应的 value 类型可不同。 | 各行必须具有相同 key。 | {'i': 42, 'j': 'a'} | STRUCT(i INTEGER, j VARCHAR) |
UNION | 多种候选数据类型的联合,每个值同一时刻只存其中一种。UNION 还包含一个判别 “tag” 值,用于检查和访问当前设置的成员类型。 | 各行可设置为 union 的不同成员类型。 | union_value(num := 2) | UNION(num INTEGER, text VARCHAR) |
大小写敏感规则
MAP 的 key 区分大小写,而 UNION 和 STRUCT 的 key 不区分大小写。
示例见 Rules for Case Sensitivity section。
更新嵌套类型的值
对嵌套类型值执行 update 时,Goose 实际执行的是先 delete 再 insert。 在包含 ART 索引(显式索引或主键/唯一约束)的表中,这可能导致意外的约束冲突。
嵌套
ARRAY、LIST、MAP、STRUCT 和 UNION 可以按任意深度嵌套,只要满足相应类型规则。
包含 LIST 的 struct:
SELECT {'birds': ['duck', 'goose', 'heron'], 'aliens': NULL, 'amphibians': ['frog', 'toad']};
包含 MAP 列表的 struct:
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 Guide。