Greenplum数据库数据类型

Greenplum数据库数据类型

Greenplum数据库有丰富的本地数据类型集供用户使用。 用户还可以使用CREATE TYPE 命令定义新的数据类型。该引用显示所有的内置数据类型。除了这里列出的类型之外, 还有一些内部使用的数据类型,例如 oid (对象标识符),但是在本指南中没有记录。

以下数据类型由SQL指定: bit, bit varying, boolean, character varying, varchar, character, char, date, double precision, integer, interval, numeric, decimal, real, smallint, time (有或没有时区)和timestamp (有或没有时区)。

每种数据类型都具有由其输入和输出功能决定的外部表现。 许多内置类型具有明显的外部格式。 但是有些数据类型只为PostgreSQL (和Greenplum数据库)所用,例如几何路径,或者一些格式可能的情况, 例如日期和时间类型。一些输入和输出功能不可逆。也就是说,与原始输入相比,输出功能的结果可能会失去准确性。

表 1. Greenplum数据库内建数据类型
名称 别名 尺寸 范围 描述
bigint int8 8 bytes -922337203​6854775808 to 922337203​6854775807 大范围整数
bigserial serial8 8 bytes 1 to 922337203​6854775807 大的自动增量整数
bit [ (n) ]   n bits bit string constant 固定长度位串
bit varying [ (n) ]1 varbit actual number of bits bit string constant 可变长度位串
boolean bool 1 byte true/false, t/f, yes/no, y/n, 1/0 逻辑布尔(true / false)
box   32 bytes ((x1,y1),(x2,y2)) 平面中的矩形框 - 分配键列中不允许。
bytea1   1 byte + binary string sequence of octets 可变长度二进制字符串
character [ (n) ]1 char [ (n) ] 1 byte + n strings up to n characters in length 定长的空白填充。
character varying [ (n) ]1 varchar [ (n) ] 1 byte + string size strings up to n characters in length 受限的可变长度。
cidr   12 or 24 bytes   IPv4和IPv6网络
circle   24 bytes <(x,y),r> (center and radius) 平面的圆 - 不允许在分配键列中。
date   4 bytes 4713 BC - 294,277 AD 日历日期(年,月,日)
decimal [ (p, s) ]1 numeric [ (p, s) ] variable no limit 用户指定的精度,精确
double precision float8

float

8 bytes 15 decimal digits precision 可变精度,不精确
inet   12 or 24 bytes   IPv4和IPv6主机和网络
integer int, int4 4 bytes -2147483648 to +2147483647 通常选择整数类型
interval [ (p) ]   12 bytes -178000000 years - 178000000 years 时间跨度
json   1 byte + json size json of any length 不受限制的可变长度
lseg   32 bytes ((x1,y1),(x2,y2)) 平面中的线段 - 分配键列中不允许。
macaddr   6 bytes   MAC 地址
money   8 bytes -92233720368547758.08 to +92233720368547758.07 货币金额
path1   16+16n bytes [(x1,y1),...] 平面上的几何路径 - 分布关键列中不允许。
point   16 bytes (x,y) 平面上的几何点 - 分布关键列中不允许。
polygon   40+16n bytes ((x1,y1),...) 在平面中封闭的几何路径 - 分配关键列中不允许。
real float4 4 bytes 6 decimal digits precision 可变精度,不准确
serial serial4 4 bytes 1 to 2147483647 自动增量整数
smallint int2 2 bytes -32768 to +32767 小范围整数
text1   1 byte + string size strings of any length 变量无限长
time [ (p) ] [ without time zone ]   8 bytes 00:00:00[.000000] - 24:00:00[.000000] 时间只有一天
time [ (p) ] with time zone timetz 12 bytes 00:00:00+1359 - 24:00:00-1359 时间只有一天, 带时区
timestamp [ (p) ] [ without time zone ]   8 bytes 4713 BC - 294,277 AD 日期和时间
timestamp [ (p) ] with time zone timestamptz 8 bytes 4713 BC - 294,277 AD 日期和时间,带时区
uuid   32 bytes   根据RFC 4122,ISO / IEC 9834-8:2005的通用唯一标识符
xml1   1 byte + xml size xml of any length 变量无限长
txid_snapshot       用户级事务ID快照

伪类型

Greenplum数据库支持统称为 伪类型的专用数据类型项。 伪类型不能用作列数据类型,但可以用于声明函数的参数或结果类型。每个可用的伪类型在函数的行为与简单地取得或返回特定SQL数据类型的值不对应的情况下很有用。

以程序语言编码的函数只能使用其实现语言所允许的伪类型。 程序语言都禁止使用伪类型作为参数类型,并且只允许使用 voidrecord作为结果类型。

伪类型记录 作为返回数据类型的函数返回未指定的行类型。 该 记录 表示可能是匿名复合类型的数组。由于 复合数据带有自己的类型识别,因此在数组级别不需要额外的知识。

伪类型void 表示函数无返回值。

注解: Greenplum数据库不支持触发器和伪类型 触发器

types anyelement, anyarray, anynonarray, 和 anyenum 多态类型的伪类型。 一些程序语言还支持使用类型 anyarray, anyelement, anyenum, 和 anynonarray的多态函数。

有关伪类型的更多信息, 请参阅有关 伪类型的Postgres文档。

多态类型

特别有趣的四种伪类型是 anyelement, anyarray, anynonarray, 和 anyenum, 它们统称为多态 类型。使用这些类型声明的任何函数都被称为多态函数。一个多态函数可以对许多不同的数据类型进行操作,特定数据类型由在运行时实际传递给它的数据类型确定。

当一个调用多态函数的查询被解析时,多态参数和结果会被绑在一起并且解析为一种特定的数据类型。声明为 anyelement 的每个位置(参数或返回值)声明为anyelement的每个位置(参数或返回值)都被允许具有任何特定的实际数据类型,但在任何给定的调用中,它们必须都是相同的实际类型 声明为anyarray c的每个位置都可以有任何数组数据类型,但类似地,它们必须都是相同的类型。 如果有声明为anyarray也有声明为 anyelement, 则再anyarray 位置中的实际数组类型 必须是一个数组的,其元素在anyelement 位置上显示相同的类型。 anynonarray 被视为与 anyelement完全相同,但添加了实际类型不能是数组类型的附加约束。anyenum 被视为与anyelement完全相同,但添加的实际类型必须是 enum类型的约束。

当多个参数位置被声明为多态类型时,net效果是仅允许实际参数类型的某些组合。 例如,一个声明为equal(anyelement, anyelement)的函数只要具有相同的数据类型,就可以使用任何两个输入值。

当函数的返回值被声明为多态类型时,还必须至少有一个参数位置也是多态的,并且作为参数提供的实际数据类型确定该调用的实际结果类型。 例如,如果没有数组下标机制,可以定义一个实现下标的函数 subscript(anyarray, integer) 返回 anyelement。此声明将实际的第一个参数限制为数组类型,并允许解析器从实际的第一个参数的类型推断出正确的结果类型。另一个例子是一个声明的函数 myfunc(anyarray) returns anyenum 将只接受数组enum 类型。

请注意,anynonarrayanyenum 不代表单独的类型变量; 它们与anyelement类型相同,只是附加约束。 例如,声明函数为 myfunc(anyelement, anyenum) 相当于将其声明为 myfunc(anyenum, anyenum): 两个实际参数必须相同 enum 类型。

当其最后一个参数被声明为一个可变函数(一个取可变数量的参数)是多态的VARIADIC anyarray。为了参数匹配和确定实际的结果类型, 这样的函数的行为与用户已经声明了适当数量的 anynonarray 参数的行为相同。

有关多态类型的更多信息,请参阅有关 多态参数和返回类型的Postgres文档。

1 对于可变长度数据类型,如果数据大于等于127字节,存储开销是每个字节需要4个字节存储。