云服务器内容精选

  • 列存表支持的数据类型 列存表支持的数据类型如表1所示。其他未列举的数据类型,暂不支持。 表1 列存表支持的数据类型 类别 数据类型 描述 长度 数值类型 smallint 小范围整数,别名为INT2。 2 integer 常用的整数,别名为INT4。 4 bigint 大范围的整数,别名为INT8。 8 decimal 任意精度型。 可变长度 numeric 任意精度型。 可变长度 real 单精度浮点数。 4 double precision 双精度浮点数。 8 smallserial 二字节序列整型。 2 serial 四字节序列整型。 4 bigserial 八字节序列整型。 8 货币类型 money 货币金额。 8 字符类型 character varying(n), varchar(n) 变长字符串。 可变长度 character(n), char(n) 定长字符串。 n character、char 单字节内部类型。 1 text 变长字符串。 可变长度 nvarchar2 变长字符串。 可变长度 clob 文本大对象。 可变长度 日期/时间类型 timestamp with time zone 日期和时间,带时区。 8 timestamp without time zone 日期和时间。 8 date Oracle兼容模式下记录日期和时间;其他兼容模式下,记录日期。 Oracle兼容模式下,占存储空间8字节;其他兼容模式下,占存储空间4字节。 time without time zone 只用于一日内时间。 8 time with time zone 只用于一日内时间,带时区。 12 interval 时间间隔。 16 JSON类型 json - - jsonb - - RoaringBitmap - 高效位图,支持int类型数据集位图计算。 可变长度 父主题: 数据类型
  • 空串与NULL Oracle兼容模式下,不区分空串与NULL,执行语句查询或数据导入时会将空串处理为NULL。 由于空串默认被处理为NULL,那就不能使用 = '' 作为查询条件,也不能用is ''。虽然不会有语法错误,但是不会有结果集返回。正确的用法是is null,不等于就是is not null 。 示例: 创建表t4,指定其字段的字符类型。 1 CREATE TABLE t4 (a text); 向表t4插入数据,插入值中包含空串和NULL。 1 2 INSERT INTO t4 VALUES('abc'),(''),(null); INSERT 0 3 查询表t4中是否存在空值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 SELECT a,a isnull FROM t4; a | ?column? -----+---------- | t | t abc | f (3 rows) SELECT a,a isnull FROM t4 WHERE a is null; a | ?column? ---+---------- | t | t (2 rows) TD与MySQL兼容模式下,区分空串与null。 TD兼容模式下示例: 1 2 3 4 5 SELECT '' is null , null is null; isnull | isnull --------+---------- f | t (1 rows) MySQL兼容模式下示例: 1 2 3 4 5 SELECT '' is null , null is null; isnull | isnull --------+---------- f | t (1 rows)
  • 定长与变长 所有字符类型根据长度是否固定可以分为定长字符串与变长字符串两大类。 对于定长字符串,长度必须确定,如果不指定长度,则默认长度1;如果数据长度不足,会在尾部自动填充空格,用于存储和显示;但这部分填充的数据是无意义的,实际使用中会被忽略,如比较、排序或类型转换。 对于变长字符串,若指定长度,则为最大可存储数据长度;如果不指定长度,则认为该字段支持任意长度。 示例: 创建表t2,指定其字段的字符类型。 1 CREATE TABLE t2 (a char(5),b varchar(5)); 向表t2插入数据并查询字段a的字节长度。因建表时指定a的字符类型为char(5)且是定长字符串,长度不足,填充空格,所以查询的字节长度为5。 1 2 3 4 5 6 7 8 INSERT INTO t2 VALUES('abc','abc'); INSERT 0 1 SELECT a,lengthb(a),b FROM t2; a | lengthb | b -------+---------+----- abc | 5 | abc (1 row) 用函数转换后查询字段a的实际字节长度为3。 1 2 3 4 5 6 7 8 9 10 11 SELECT a = b from t2; ?column? ---------- t (1 row) SELECT cast(a as text) as val,lengthb(val) FROM t2; val | lengthb -----+--------- abc | 3 (1 row)
  • 长度 如果把一个字段定义为char(n)或者varchar(n), 代表该字段最大可容纳n个长度的数据。无论哪种类型,可设置的最大长度都不得超过10485760(即10MB)。 当数据长度超过指定的长度n时,会抛出错误"value too long"。也可通过指定数据类型,使超过长度的数据自动截断。 示例: 创建表t1,指定其字段的字符类型。 1 CREATE TABLE t1 (a char(5),b varchar(5)); 向表t1插入数据时超过指定的字节长度报错。 1 2 3 INSERT INTO t1 VALUES('bookstore','123'); ERROR: value too long for type character(5) CONTEXT: referenced column: a 向表t1插入数据并明确超过指定字节长度后自动截断。 1 2 3 4 5 6 7 8 INSERT INTO t1 VALUES('bookstore'::char(5),'12345678'::varchar(5)); INSERT 0 1 SELECT a,b FROM t1; a | b -------+------- books | 12345 (1 row)
  • 浮点类型 浮点类型属于非精确,可变精度的数值类型。实际上,这些类型通常是对于二进制浮点算术(分别是单精度和双精度)的IEEE标准754的具体实现,在一定范围内由特定的处理器,操作系统和编译器所支持。 表3 浮点类型 名称 描述 存储空间 范围 REAL, FLOAT4 单精度浮点数,不精准。 4字节 6位十进制数字精度。 DOUBLE PRECISION, FLOAT8 双精度浮点数,不精准。 8字节 1E-307~1E+308, 15位十进制数字精度。 FLOAT[(p)] 浮点数,不精准。精度p取值范围为[1,53]。 说明: p为精度,表示总位数。 4字节或8字节 根据精度p不同选择REAL或DOUBLE PRECISION作为内部表示。如不指定精度,内部用DOUBLE PRECISION表示。 BINARY_DOUBLE 是DOUBLE PRECISION的别名,为兼容Oracle类型。 8字节 1E-307~1E+308, 15位十进制数字精度。 DEC[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 说明: p为总位数,s为小数位位数。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 INTEGER[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 示例: 创建带有浮点类型的表。 1 2 3 4 5 6 7 8 9 10 CREATE TABLE float_type_t2 ( FT_COL1 INTEGER, FT_COL2 FLOAT4, FT_COL3 FLOAT8, FT_COL4 FLOAT(3), FT_COL5 BINARY_DOUBLE, FT_COL6 DECIMAL(10,4), FT_COL7 INTEGER(6,3) ) DISTRIBUTE BY HASH ( ft_col1); 插入数据。 1 INSERT INTO float_type_t2 VALUES(10,10.365456,123456.1234,10.3214, 321.321, 123.123654, 123.123654); 查看数据。 1 2 3 4 5 SELECT * FROM float_type_t2; ft_col1 | ft_col2 | ft_col3 | ft_col4 | ft_col5 | ft_col6 | ft_col7 ---------+---------+-------------+---------+---------+----------+--------- 10 | 10.3655 | 123456.1234 | 10.3214 | 321.321 | 123.1237 | 123.124 (1 row)
  • 序列整型 SMALLSERIAL,SERIAL和BIGSERIAL类型不是真正的类型,只是为在表中设置唯一标识而存在的概念。因此,创建一个整数字段,并且把它的缺省数值安排为从一个序列发生器读取。应用了一个NOT NULL约束以确保NULL不会被插入。在大多数情况下用户可能还希望附加一个UNIQUE或PRIMARY KEY约束避免意外地插入重复的数值。最后,将序列发生器从属于那个字段,这样当该字段或表被删除的时候也一并删除该序列。目前只支持在创建表时指定SERIAL列,不可以在已有的表中增加SERIAL列。另外临时表也不支持创建SERIAL列。因为SERIAL不是真正的类型,也不可以将表中存在的列类型转化为SERIAL。 表4 序列整型 名称 描述 存储空间 范围 SMALLSERIAL 二字节序列整型。 2字节 1 ~ 32,767 SERIAL 四字节序列整型。 4字节 1 ~ 2,147,483,647 BIGSERIAL 八字节序列整型。 8字节 1 ~ 9,223,372,036,854,775,807 示例: 创建带有序列类型的表。 1 CREATE TABLE smallserial_type_tab(a SMALLSERIAL); 插入数据。 1 INSERT INTO smallserial_type_tab VALUES(default); 再次插入数据。 1 INSERT INTO smallserial_type_tab VALUES(default); 查看数据。 1 2 3 4 5 6 SELECT * FROM smallserial_type_tab; a --- 1 2 (2 rows) 插入NULL值会报错。 1 2 INSERT INTO smallserial_type_tab VALUES(NULL); ERROR: dn_6001_6002: null value in column "a" violates not-null constraint
  • 任意精度型 NUMBER类型能够用于存储对于精度位数没有限制的数字,并且可以用于执行精确计算。当要求高精确度时,推荐使用这种类型来存储货币总量和其他类型的数量值。与整数类型相比,任意精度类型需要更大的存储空间,其存储效率、运算效率以及压缩比效果都要差一些。 NUMBER类型数值的范围是小数点右边部分的小数位数。NUMBER类型数值的精度是指整个数值包含的所有数字,也就是小数点左右两边的所有数字。所以,可以说数值23.1234的精度为6,范围是4。可以认为整数的范围是0。 使用Numeric/Decimal进行列定义时,建议指定该列的精度p(总位数)以及范围s(小数位数)。 如果数值的精度或者范围大于列的数据类型所声明的精度和范围,那么系统将会试图对这个值进行四舍五入。如果不能对数值进行四舍五入的处理来满足数据类型的限制,则会报错。 表2 任意精度型 名称 描述 存储空间 范围 NUMERIC[(p[,s])], DECIMAL[(p[,s])] 精度p取值范围为[1,1000],标度s取值范围为[0,p]。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 NUMBER[(p[,s])] NUMERIC类型的别名,为兼容Oracle数据类型。 用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。 未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。 示例: 创建带有DECIMAL数值类型的表。 1 CREATE TABLE decimal_type_t1 (DT_COL1 DECIMAL(10,4)); 插入数据。 1 2 INSERT INTO decimal_type_t1 VALUES(123456.122331); INSERT INTO decimal_type_t1 VALUES(123456.452399); 查看数据。 1 2 3 4 5 6 SELECT * FROM decimal_type_t1; dt_col1 ------------- 123456.1223 123456.4524 (2 rows)
  • 整数类型 TINYINT、SMALLINT、INTEGER、BINARY_INTEGER和BIGINT类型存储整个数值(不带有小数部分),也就是整数。如果尝试存储超出范围以外的数值将会导致错误。 常用的类型是INTEGER,一般只有取值范围确定不超过SMALLINT的情况下,才会使用SMALLINT类型。而只有在INTEGER的范围不够的时候才使用BIGINT,因为前者相对快得多。 表1 整数类型 名称 描述 存储空间 范围 TINYINT 微整数,别名为INT1。 1字节 0 ~ 255 SMALLINT 小范围整数,别名为INT2。 2字节 -32,768 ~ +32,767 INTEGER 常用的整数,别名为INT4。 4字节 -2,147,483,648 ~ +2,147,483,647 BINARY_INTEGER 常用的整数INTEGER的别名,为兼容Oracle类型。 4字节 -2,147,483,648 ~ +2,147,483,647 BIGINT 大范围的整数,别名为INT8。 8字节 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 示例: 创建带有TINYINT、INTEGER、BIGINT类型数据的表。 1 2 3 4 5 6 7 CREATE TABLE int_type_t1 ( a TINYINT, b TINYINT, c INTEGER, d BIGINT ); 插入数据。 1 INSERT INTO int_type_t1 VALUES(100, 10, 1000, 10000); 查看数据。 1 2 3 4 5 SELECT * FROM int_type_t1; a | b | c | d -----+----+------+------- 100 | 10 | 1000 | 10000 (1 row)
  • 空串与NULL Oracle兼容模式下,不区分空串与NULL,执行语句查询或数据导入时会将空串处理为NULL。 由于空串默认被处理为NULL,那就不能使用 = '' 作为查询条件,也不能用is ''。虽然不会有语法错误,但是不会有结果集返回。正确的用法是is null,不等于就是is not null 。 示例: 创建表t4,指定其字段的字符类型。 1 CREATE TABLE t4 (a text); 向表t4插入数据,插入值中包含空串和NULL。 1 2 INSERT INTO t4 VALUES('abc'),(''),(null); INSERT 0 3 查询表t4中是否存在空值。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 SELECT a,a isnull FROM t4; a | ?column? -----+---------- | t | t abc | f (3 rows) SELECT a,a isnull FROM t4 WHERE a is null; a | ?column? ---+---------- | t | t (2 rows) TD与MySQL兼容模式下,区分空串与null。 TD兼容模式下示例: 1 2 3 4 5 SELECT '' is null , null is null; isnull | isnull --------+---------- f | t (1 rows) MySQL兼容模式下示例: 1 2 3 4 5 SELECT '' is null , null is null; isnull | isnull --------+---------- f | t (1 rows)
  • 定长与变长 所有字符类型根据长度是否固定可以分为定长字符串与变长字符串两大类。 对于定长字符串,长度必须确定,如果不指定长度,则默认长度1;如果数据长度不足,会在尾部自动填充空格,用于存储和显示;但这部分填充的数据是无意义的,实际使用中会被忽略,如比较、排序或类型转换。 对于变长字符串,若指定长度,则为最大可存储数据长度;如果不指定长度,则认为该字段支持任意长度。 示例: 创建表t2,指定其字段的字符类型。 1 CREATE TABLE t2 (a char(5),b varchar(5)); 向表t2插入数据并查询字段a的字节长度。因建表时指定a的字符类型为char(5)且是定长字符串,长度不足,填充空格,所以查询的字节长度为5。 1 2 3 4 5 6 7 8 INSERT INTO t2 VALUES('abc','abc'); INSERT 0 1 SELECT a,lengthb(a),b FROM t2; a | lengthb | b -------+---------+----- abc | 5 | abc (1 row) 用函数转换后查询字段a的实际字节长度为3。 1 2 3 4 5 6 7 8 9 10 11 SELECT a = b from t2; ?column? ---------- t (1 row) SELECT cast(a as text) as val,lengthb(val) FROM t2; val | lengthb -----+--------- abc | 3 (1 row)
  • 长度 如果把一个字段定义为char(n)或者varchar(n), 代表该字段最大可容纳n个长度的数据。无论哪种类型,可设置的最大长度都不得超过10485760(即10MB)。 当数据长度超过指定的长度n时,会抛出错误"value too long"。也可通过指定数据类型,使超过长度的数据自动截断。 示例: 创建表t1,指定其字段的字符类型。 1 CREATE TABLE t1 (a char(5),b varchar(5)); 向表t1插入数据时超过指定的字节长度报错。 1 2 3 INSERT INTO t1 VALUES('bookstore','123'); ERROR: value too long for type character(5) CONTEXT: referenced column: a 向表t1插入数据并明确超过指定字节长度后自动截断。 1 2 3 4 5 6 7 8 INSERT INTO t1 VALUES('bookstore'::char(5),'12345678'::varchar(5)); INSERT 0 1 SELECT a,b FROM t1; a | b -------+------- books | 12345 (1 row)
  • IPADDRESS IP地址,可以表征IPv4或者IPv6地址。但在系统内,该类型是一个统一的IPv6地址。 对于IPv4的支持,是通过将IPv4映射到IPv6的取值范围(RFC 4291#section-2.5.5.2)来实现的。当创建一个IPv4时,会被映射到IPv6。当格式化时,如果数据是IPv4又会被重新映射为IPv4。 其他的地址则会按照RFC 5952所定义的规范格式来进行格式化。 示例: select IPADDRESS '10.0.0.1', IPADDRESS '2001:db8::1'; _col0 | _col1 ----------|------------- 10.0.0.1 | 2001:db8::1 (1 row)
  • UUID 标准UUID (Universally Unique IDentifier),也被称为GUID (Globally Unique IDentifier)。 遵从RFC 4122标准所定义的格式。 示例: select UUID '12151fd2-7586-11e9-8f9e-2a86e4085a59'; _col0 -------------------------------------- 12151fd2-7586-11e9-8f9e-2a86e4085a59 (1 row)
  • ROW ROW的字段可是任意所支持的数据类型,也支持各字段数据类型不同的混合方式。 --创建ROW表 create table row_tb (id int,col1 row(a int,b varchar)); --插入ROW类型数据 insert into row_tb values (1,ROW(1,'HetuEngine')); --查询数据 select * from row_tb; id | col1 ----|--------------z 1 | {a=1, b=HetuEngine} --字段是支持命名的,默认情况下,Row的字段是未命名的 select row(1,2e0),CAST(ROW(1, 2e0) AS ROW(x BIGINT, y DOUBLE)); _col0 | _col1 ------------------------|-------------- {1, 2.0} | {x=1, y=2.0} (1 row) --命名后的字段,可以通过域操作符"."访问 select col1.b from row_tb; -- HetuEngine --命名和未命名的字段,都可以通过位置索引来访问,位置索引从1开始,且必须是一个常量 select col1[1] from row_tb; -- 1
  • HYPER LOG LOG 基数统计。 用HyperLogLog来近似计算唯一数的计数值,其代价要远远小于用count来计算。 参见HyperLogLog函数函数。 HyperLogLog A HyperLogLog sketch可以用来高效的计算distinct()的近似值。 它以一个稀疏的表征开始,然后变成一个密集的表征,此时效率将变得更高。 P4HyperLogLog 类似于A HyperLogLog sketch,但是它以一个密集的表征开始。