Hologres的数据类型与PostgreSQL的数据类型兼容。本文为您介绍Hologres支持的数据类型及数组类型。
数据类型
当前Hologres版本支持的数据类型是PostgreSQL的一个子集。Hologres已支持的数据类型列表如下。
名称  | 支持的版本  | 存储大小  | 说明  | 取值范围  | 示例  | 
INTEGER(别名INT或INT4)  | Hologres所有版本  | 4字节  | 常用的整数  | -2147483648~+2147483647  | 2147483647  | 
BIGINT(别名INT8)  | Hologres所有版本  | 8字节  | 大范围整数  | -9223372036854775808~+9223372036854775807  | 9223372036854775807  | 
BOOLEAN(别名BOOL)  | Hologres所有版本  | 1字节  | 布尔类型  | 
  | True  | 
REAL(别名FLOAT4)  | Hologres所有版本  | 4字节  | 可变精度,不精确。 说明  在PostgreSQL生态中FLOAT不设置精度默认对应的是DOUBLE PRECISION(FLOAT8)。  | 精度为6位的十进制数字。  | 123.123  | 
DOUBLE PRECISION(别名FLOAT8)  | Hologres所有版本  | 8字节  | 可变精度,不精确。  | 精度为15位的十进制数字。  | 123.123456789123  | 
TEXT  | Hologres所有版本  | 可变长  | 可变长度字符串。TEXT类型相比VARCHAR(n)、CHAR(n)具备更高的灵活性,建议使用TEXT类型,而不是VARCHAR(n)、CHAR(n)。  | 无  | abcdefg  | 
TIMESTAMP WITH TIME ZONE(别名TIMESTAMPTZ)  | Hologres所有版本  | 8字节  | 带时区的时间戳。存储精度为毫秒。 说明  标准PostgreSQL使用  | 4713 BC~294276 AD  | 2004-10-19 10:23:54+02  | 
DECIMAL(别名NUMERIC)  | Hologres所有版本  | 可变长  | 需要指定PRECISION和SCALE: 
  | 共可以指定38位数字(包含整数位和小数位)。  | DECIMAL(38, 10)  | 
DATE  | Hologres 0.8版本新增  | 4字节  | 单位为一天。  | 4713 BC ~ 5874897 AD  | 2004-10-19  | 
TIMESTAMP  | Hologres 0.8版本新增  | 8字节  | 不包含时区的时间戳,存储精度为微秒。  | 4713 BC ~ 5874897 AD  | 2020-01-01 01:01:01.123456  | 
CHAR(n)  | Hologres 0.8版本新增  | 固定字符长度,最长n个字符。  | 存储字节不大于1 GB。  | 固定字符长度的字符串。  | 
  | 
VARCHAR(n)  | Hologres 0.8版本新增  | 可变长,不超过n个字符。  | 存储字节不大于1 GB。  | 有限字符长度的可变字符串。  | abcdefg  | 
SERIAL(自增序列)  | Hologres 0.8版本新增  | 详情请参见 自增序列Serial(Beta)。  | 无  | 无  | 无  | 
SMALLINT  | Hologres 0.9版本新增  | 2字节  | 小范围整数  | -32768~+32767  | 32767  | 
JSON和JSONB  | Hologres 0.9版本新增  | 详情请参见JSON和JSONB类型。  | 无  | 无  | 无  | 
BYTEA  | Hologres 0.9版本新增  | 可变长,详情请参见Binary Data Types。  | 可变长的二进制串。  | 存储字节不超过1 GB。  | 无  | 
RoaringBitmap  | Hologres 0.10版本新增  | 可变长,详情请参见RoaringBitmap函数。  | 高效的INT类型数组,支持常量数组位图计算。  | 无  | 无  | 
RoaringBitmap64  | Hologres 3.1版本新增  | 可变长,详情请参见RoaringBitmap函数。  | 高效的BIGINT类型数组,支持常量数组位图计算。  | 无  | 无  | 
BIT(n)  | Hologres 0.9版本新增  | 长度为n个bit的二进制串  | 固定长度的二进制串。  | 存储字节不超过1 GB。  | 无  | 
VARBIT(n)  | Hologres 0.9版本  | 可变长,长度不超过n个bit的二进制串  | 有限bit长度的二进制串  | 存储字节不超过1 GB。  | 无  | 
INTERVAL  | Hologres 所有版本  | 16字节  | 无  | -178000000 years~178000000 years  | interval '1 year'  | 
TIMETZ  | Hologres 0.9版本新增  | 12字节  | 一天中的时间(带时区),解析度为微秒。  | 00:00:00~24:00:00  | 12:00:00+08  | 
TIME  | Hologres 0.9版本新增  | 8字节  | 一天中的时间(不带时区),解析度为微秒。  | 00:00:00~24:00:00  | 12:00:00  | 
INET  | Hologres 0.9版本新增  | 详情请参见网络地址类型。  | INE在一个数据域里保存一个IPv4 或IPv6主机地址。  | 无  | 192.168.100.128/25  | 
MONEY  | Hologres 0.9版本新增  | 8字节,详情请参见货币类型。  | money类型存储固定小数精度的货币数字。  | -92233720368547758.08~+92233720368547758.07  | 12.34美元  | 
OID  | Hologres 0.9版本新增  | 4字节  | 数字形式的对象标识符。  | 无  | 1024  | 
UUID  | Hologres 0.9版本新增  | 16字节  | 通用唯一标识符,定长128位。 说明  目前还不支持uuid-ossp中实现的算法。详情请参见uuid。  | 00000000-0000-0000-0000-000000000000~ffffffff-ffff-ffff-ffff-ffffffffffff  | a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11  | 
TIMESTAMP WITH TIME ZONE、DATE和DECIMAL的示例SQL语句如下。
CREATE TABLE test_data_type (
  tswtz_column TIMESTAMP WITH TIME ZONE,
  date_column date,
  decimal_column decimal(38, 10),
  char_column char(20),
  varchar_volumn varchar(225)
);
INSERT INTO test_data_type
VALUES ('2004-10-19 08:08:08', '2004-10-19', 123.456, 'abcd', 'a');
SELECT * FROM test_data_type;
      tswtz_column      | date_column | decimal_column |     char_column      | varchar_volumn 
------------------------+-------------+----------------+----------------------+----------------
 2004-10-19 08:08:08+08 | 2004-10-19  | 123.4560000000 | abcd                 | a
(1 row)BIT、VARBIT和BYTEA的示例SQL语句如下。
//BIT、VARBIT
CREATE TABLE test (a BIT(3), b BIT VARYING(5));
INSERT INTO test VALUES (B'101', B'00');
INSERT INTO test VALUES (B'10', B'101');
ERROR:  bit string length 2 does not match type bit(3)
INSERT INTO test VALUES (B'10'::bit(3), B'101');
SELECT * FROM test;
  a  |  b
-----+-----
 101 | 00
 100 | 101
//BYTEA
SET bytea_output = 'escape';
SELECT 'abc \153\154\155 \052\251\124'::bytea;
     bytea
----------------
 abc klm *\251T
 
RESET bytea_output;  -- 'hex' by default
SELECT 'abc \153\154\155 \052\251\124'::bytea;
          bytea
--------------------------
 \x616263206b6c6d202aa954
(1 row)数组类型
Hologres当前版本仅支持如下一维数组:
int4[]
int8[]
float4[]
float8[]
boolean[]
text[]
使用示例:
声明数组。
CREATE TABLE array_example( int4_array int4[], int8_array int8[], float4_array float4[], float8_array float8[], boolean_array boolean[], text_array text[]);插入数组。
使用ARRAY关键字。
INSERT INTO array_example( int4_array, int8_array, float4_array, float8_array, boolean_array, text_array) VALUES (ARRAY[1, 2, 3, 4], ARRAY[1, 2, 3, 4], ARRAY[1.0, 2.0], ARRAY[1.0, 2.0, 3.0], ARRAY[true, true, false], ARRAY['foo1', 'foo2', 'foo3']);使用
{}表达式。INSERT INTO array_example( int4_array, int8_array, float4_array, float8_array, boolean_array, text_array) VALUES ('{1, 2, 3, 4}', '{1, 2, 3, 4}', '{1.0, 2.0}', '{1.0, 2.0, 3.0}', '{true, true, false}', '{"foo1", "foo2", "foo3"}');
查询数组。
查询数组中单个元素。
SELECT int4_array[3] FROM array_example;查询数组中多个元素。
SELECT int4_array[1:2] FROM array_example;
MaxCompute与Hologres的数据类型映射
创建MaxCompute外部表时,MaxCompute与Hologres的数据类型映射如下表所示。
MaxCompute数据类型  | Hologres数据类型  | 支持映射的版本  | 说明  | 
  | TEXT  | Hologres所有版本  | 无  | 
BIGINT  | INT8  | Hologres所有版本  | 无  | 
INT  | 
  | Hologres所有版本  | 无  | 
FLOAT  | 
  | Hologres所有版本  | 无  | 
DOUBLE  | 
  | Hologres所有版本  | 无  | 
BOOLEAN  | BOOL  | Hologres所有版本  | 无  | 
DATETIME  | TIMESTAMP WITH TIME ZONE  | Hologres所有版本  | MaxCompute的DATETIME是日期时间类型,使用东八区时间作为系统标准时间。范围从0000年1月1日到9999年12月31日,精确到毫秒 。  | 
DECIMAL  | NUMERIC  | Hologres所有版本  | MaxCompute的DECIMAL如果未指定精度,则默认为(38,18),使用IMPORT FOREIGN SCHEMA创建表时系统会自动转换精度。  | 
TIMESTAMP  | TIMESTAMP WITH TIME ZONE  | Hologres 0.8新增  | 
  | 
CHAR(n)  | 默认为CHAR(n)。 Hologres也支持映射MaxCompute的CHAR(n)为TEXT类型。您需要设置参数  | Hologres 0.8新增  | MaxCompute的CHAR(n)为固定长度字符类型,n为长度。最大取值为255。长度不足则使用空格填充。  | 
VARCHAR(n)  | 默认为VARCHAR(n)。 Hologres也支持映射MaxCompute的VARCHAR(n)为TEXT类型。您需要设置参数  | Hologres 0.8新增  | MaxCompute的VARCHAR(n)为变长字符类型,n为长度。取值范围为1~65535。  | 
DATE  | DATE  | Hologres 0.8新增  | 无  | 
SMALLINT  | 默认为INT2。 Hologres也支持映射MaxCompute的SMALLINT为INT8类型。您需要设置参数  | Hologres所有版本(0.8版本为 int4, 0.9版本为int2)  | 无  | 
TINYINT  | 默认为INT2。 Hologres也支持映射MaxCompute的TINYINT为INT8类型。您需要设置参数  | Hologres所有版本(0.8版本为 int4, 0.9版本为int2)  | 无  | 
CHAR  | 不支持  | 不支持  | 无  | 
ARRAY<INT>  | INT4[]  | Hologres 0.8新增  | 无  | 
ARRAY<BIGINT>  | INT8[]  | Hologres 0.8新增  | 无  | 
ARRAY<FLOAT>  | FLOAT4[]  | Hologres 0.8新增  | 无  | 
ARRAY<DOUBLE>  | FLOAT8[]  | Hologres 0.8新增  | 无  | 
ARRAY<BOOLEAN>  | BOOLEAN[]  | Hologres 0.8新增  | 无  | 
ARRAY<STRING>  | TEXT[]  | Hologres 0.8新增  | 无  | 
BINARY  | BYTEA  | Hologres 0.9新增  | 无  | 
ARRAY<TINYINT>  | 不支持  | 不支持  | 无  | 
ARRAY<SMALLINT>  | 不支持  | 不支持  | 无  | 
当MaxCompute数据表中含有Hologres不支持的类型字段时,如果Hologres不访问该字段,则可以正常查询所支持的类型字段。
Blink/Flink与Hologres的数据类型映射
Blink/Flink与Hologres的数据类型映射如下表所示。
Binlog源表目前只支持部分数据类型,详情请参见Flink/Blink实时消费Hologres Binlog。
Flink数据类型  | Hologres数据类型  | 支持映射的Hologres版本  | 支持映射的Flink版本  | 
INT  | 
  | Hologres所有版本  | 所有版本  | 
BIGINT  | INT8  | Hologres所有版本  | 所有版本  | 
VARCHAR  | TEXT  | Hologres所有版本  | 所有版本  | 
DOUBLE  | 
  | Hologres所有版本  | 所有版本  | 
BOOLEAN  | BOOL  | Hologres所有版本  | 所有版本  | 
DECIMAL  | NUMERIC 说明  在使用CTAS同步数据至Hologres时: 
 更多详细介绍,请参见为什么主键为bigint unsigned的MySQL表注册Flink Catalog,主键会变为decimal?但是使用CTAS同步到Hologres后,主键又变为text?。  | Hologres所有版本  | 所有版本  | 
DATE  | DATE  | Hologres 0.8新增  | 所有版本  | 
TIMESTAMP  | TIMESTAMP WITH TIME ZONE  | Hologres所有版本  | 所有版本  | 
FLOAT  | 
  | Hologres所有版本  | 所有版本  | 
TIME  | TIME和TIMETZ  | Hologres所有版本 说明  Hologres V2.1.24版本起,Fixed Plan加速SQL执行支持TIME和TIMETZ类型。  | 
  | 
VARCHAR  | JSONB  | Hologres 0.10新增  | 
  | 
VARCHAR  | JSON  | Hologres 0.9新增  | 
  | 
BYTES  | RoaringBitmap  | Hologres 0.10新增  | 
  | 
VARCHAR  | GEOMETRY和GEOGRAPHY  | Hologres所有版本 说明  Hologres V2.1版本起,Fixed Plan加速SQL执行支持TGEOMETRY和GEOGRAPHY类型的数据写入。  | 
  | 
TINYINT  | SMALLINT  | Hologres所有版本  | 
  | 
SMALLINT  | SMALLINT  | Hologres所有版本  | 
  | 
ARRAY<INT>  | int4[]  | Hologres 0.8新增  | 
  | 
ARRAY<BIGINT>  | int8[]  | Hologres 0.8新增  | 
  | 
ARRAY<FLOAT>  | float4[]  | Hologres 0.8新增  | 
  | 
ARRAY<DOUBLE>  | float8[]  | Hologres 0.8新增  | 
  | 
ARRAY<BOOLEAN>  | boolean[]  | Hologres 0.8新增  | 
  | 
ARRAY<VARCHAR>  | TEXT[]  | Hologres 0.8新增  | 
  | 
CHAR  | 不支持  | 不支持  | 不支持  | 
BINARY  | 不支持  | 不支持  | 不支持  | 
MySQL与Hologres数据类型映射
MySQL与Hologres数据类型映射如下表所示,关于MySQL迁移至Hologres的详情请参见迁移MySQL至Hologres。
MySQL数据类型  | Hologres数据类型  | 
BIGINT  | BIGINT  | 
BINARY(n)  | BYTEA  | 
BIT  | BOOLEAN  | 
  | 
  | 
DATE  | DATE  | 
DATETIME  | TIMESTAMP [WITHOUT TIME ZONE]  | 
  | 
  | 
DOUBLE  | DOUBLE PRECISION  | 
FLOAT  | REAL  | 
  | 
  | 
MEDIUMINT  | INTEGER  | 
NUMERIC(p,s)  | NUMERIC(p,s)  | 
SMALLINT  | SMALLINT  | 
  | BYTEA  | 
TINYINT  | SMALLINT  | 
  | TEXT  | 
TIME  | TIME [WITHOUT TIME ZONE]  | 
TIMESTAMP  | TIMESTAMP [WITH TIME ZONE]  | 
  | BYTEA  | 
VARCHAR(n)  | VARCHAR(n)  | 
VARCHAR(max)  | TEXT  | 
DLF与Hologres的数据类型映射
DLF数据类型  | Hologres数据类型  | 
TINYINT  | SMALLINT  | 
SMALLINT  | SMALLINT  | 
INT  | INT  | 
BIGINT  | BIGINT  | 
BOOLEAN  | BOOLEAN  | 
FLOAT  | REAL  | 
DOUBLE  | DOUBLE PRECISION  | 
DATE  | DATE  | 
TIMESTAMP  | TIMESTAMP WITHOUT TIME ZONE  | 
STRING  | TEXT  | 
BINARY  | BYTEA  | 
DECIMAL(m,n)  | NUMERIC(m,n)  | 
VARCHAR(n)  | CHARACTER VARYING(n)  | 
CHAR(n)  | CHARACTOR(n)  | 
ARRAY<type>  | ARRAY<hologres_data_type> 支持的类型如下: 
  | 
Hive数据类型与Hologres的数据类型映射
Hive数据类型  | Hologres数据类型  | 
TINYINT  | SMALLINT  | 
SMALLINT  | SMALLINT  | 
INT  | INT  | 
BIGINT  | BIGINT  | 
FLOAT  | REAL  | 
DOUBLE  | DOUBLE PRECISION  | 
DECIMAL  | NUMERIC  | 
NUMERIC  | NUMERIC  | 
DATE  | DATE  | 
TIMESTAMP  | TIMESTAMP WITHOUT TIME ZONE  | 
STRING  | TEXT  | 
VARCHAR  | VARCHAR  | 
CHAR  | CHAR  | 
BINARY  | BYTEA  | 
BOOL  | BOOLEAN  | 
ARRAY<type>  | ARRAY<hologres_data_type> 支持的类型如下: 
  | 
Hudi数据类型与Hologres的数据类型映射
Hologres从V1.3版本开始支持。
Hudi数据类型  | Hologres数据类型  | 
IntegerType  | INT  | 
LongType  | BIGINT  | 
FloatType  | REAL  | 
DoubleType  | DOUBLE PRECISION  | 
DecimalType  | NUMERIC  | 
TimestampType  | TIMESTAMP WITHOUT TIME ZONE  | 
DateType  | DATE  | 
YearMonthIntervalType  | 不支持  | 
DayTimeIntervalType  | 不支持  | 
StringType  | TEXT  | 
VarcharType  | 不支持  | 
CharType  | 不支持  | 
BooleanType  | BOOL  | 
BinaryType  | BYTEA  | 
ByteType  | 不支持  | 
ShortType  | 不支持  | 
ArrayType(elementType, containsNull)  | ARRAY<hologres_data_type> 支持类型如下: 
  | 
Delta数据类型与Hologres的数据类型映射
Hologres从V1.3版本开始支持。
Delta Lake数据类型  | Hologres数据类型  | 
TINYINT  | SMALLINT  | 
SMALLINT  | SMALLINT  | 
INT  | INT  | 
BIGINT  | BIGINT  | 
FLOAT  | REAL  | 
DOUBLE  | DOUBLE PRECISION  | 
DECIMAL(p,s)  | NUMERIC  | 
TIMESTAMP  | TIMESTAMP WITHOUT TIME ZONE  | 
DATE  | DATE  | 
INTERVAL intervalQualifier  | 不支持  | 
STRING  | TEXT  | 
BOOLEAN  | BOOLEAN  | 
BINARY  | BYTEA  | 
ARRAY<elementType>  | ARRAY<hologres_data_type> 支持类型如下: 
  | 
Paimon数据类型与Hologres数据类型映射
Paimon数据类型  | Hologres数据类型  | 
TINYINT  | SMALLINT  | 
SMALLINT  | SMALLINT  | 
INT  | INT  | 
BIGINT  | BIGINT  | 
FLOAT  | REAL  | 
DOUBLE  | DOUBLE PRECISION  | 
DECIMAL(p,s)  | DECIMAL  | 
TIMESTAMP  | TIMESTAMP WITHOUT TIME ZONE  | 
DATE  | DATE  | 
CHAR  | CHAR  | 
VARCHAR  | VARCHAR  | 
BINARY  | BYTEA  | 
ARRAY  | ARRAY<hologres_data_type> 支持类型如下: 
  | 
Iceberg与Hologres数据类型映射
Iceberg数据类型  | Hologres数据类型  | 
BOOLEAN  | BOOLEAN  | 
INT  | INTEGER  | 
LONG  | BIGINT  | 
FLOAT  | REAL  | 
DOUBLE  | DOUBLE PRECISION  | 
DECIMAL(P,S)  | NUMERIC(P,S)  | 
DATE  | DATE  | 
TIME  | TEXT(Spark不支持TIME类型,Flink的TIME类型写入DLF中就变成STRING类型)  | 
TIMESTAMP  | TIMESTAMP WITHOUT TIME ZONE  | 
TIMESTAMPTZ  | 暂不支持  | 
STRING  | TEXT  | 
UUID  | 暂不支持(Flink/Spark写不出这种类型)  | 
FIXED(L)  | BYTEA  | 
BINARY  | BYTEA  | 
LIST  | ARRAY<hologres_data_type> 支持类型如下: 
  | 
STRUCT  | 不支持  | 
MAP  | 不支持  |