数据类型汇总

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

  • False

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使用TIMESTAMPTZ+或者-符号,以及符号后的时区偏移来识别TIMESTAMP WITH TIME ZONE的时区。如果未表明时区偏移,则系统自动给数据添加默认时区。

4713 BC~294276 AD

2004-10-19 10:23:54+02

DECIMAL(别名NUMERIC)

Hologres所有版本

可变长

需要指定PRECISION和SCALE:

  • PRECISION:表示数字的位数,取值范围为0~38。

  • SCALE:表示小数部分的位数,取值范围为0~PRECISION。

可以指定数据到小数点前的38位和小数点后的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。

固定字符长度的字符串。

  • abcd

  • 中国人民

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类型数组,支持常量数组位图计算。

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数据类型

支持映射的版本

说明

  • STRING

  • VARCHAR

TEXT

Hologres所有版本

BIGINT

INT8

Hologres所有版本

INT

  • INT4

  • INT

Hologres所有版本

FLOAT

  • FLOAT4

  • REAL

Hologres所有版本

DOUBLE

  • FLOAT

  • FLOAT8

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新增

  • MaxCompute的TIMESTAMP取值范围为0000-01-01 00:00:00.000000000~9999-12-31 23:59:59.999999999,精确到纳秒。

  • Hologres支持的TIMESTAMPTZ精确到毫秒。

    Hologres内部已做精度转换,在读取过程中会自动处理成毫秒。

CHAR(n)

默认为CHAR(n)。

Hologres也支持映射MaxCompute的CHAR(n)为TEXT类型。您需要设置参数set hg_enable_convert_type_for_foreign_table = true,并在建表时将字段类型修改为TEXT。

Hologres 0.8新增

MaxCompute的CHAR(n)为固定长度字符类型,n为长度。最大取值为255。长度不足则使用空格填充。

VARCHAR(n)

默认为VARCHAR(n)。

Hologres也支持映射MaxCompute的VARCHAR(n)为TEXT类型。您需要设置参数set hg_enable_convert_type_for_foreign_table = true,并在建表时将字段类型修改为TEXT。

Hologres 0.8新增

MaxCompute的VARCHAR(n)为变长字符类型,n为长度。取值范围为1~65535。

DATE

DATE

Hologres 0.8新增

SMALLINT

默认为INT2。

Hologres也支持映射MaxCompute的SMALLINT为INT8类型。您需要设置参数set hg_enable_convert_type_for_foreign_table = true,并在建表时将字段类型修改为INT8。

Hologres所有版本(0.8版本为 int4, 0.9版本为int2)

TINYINT

默认为INT2。

Hologres也支持映射MaxCompute的TINYINT为INT8类型。您需要设置参数set hg_enable_convert_type_for_foreign_table = true,并在建表时将字段类型修改为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

  • INT4

  • INT

Hologres所有版本

所有版本

BIGINT

INT8

Hologres所有版本

所有版本

VARCHAR

TEXT

Hologres所有版本

所有版本

DOUBLE

  • FLOAT

  • FLOAT8

  • DOUBLE PRECISION

Hologres所有版本

所有版本

BOOLEAN

BOOL

Hologres所有版本

所有版本

DECIMAL

NUMERIC

说明

在使用CTAS同步数据至Hologres时:

  • DECIMAL类型的主键将被映射为TEXT类型。

  • DECIMAL类型不是主键,将被映射为DECIMAL类型。

更多详细介绍,请参见为什么主键为bigint unsigned的MySQL表注册Flink Cataolg,主键会变为decimal?但是使用CTAS同步到Hologres后,主键又变为text?

Hologres所有版本

所有版本

DATE

DATE

Hologres 0.8新增

所有版本

TIMESTAMP

TIMESTAMP WITH TIME ZONE

Hologres所有版本

所有版本

FLOAT

  • FLOAT4

  • REAL

Hologres所有版本

所有版本

TIME

TIME和TIMETZ

Hologres所有版本

说明

Hologres V2.1.24版本起,Fixed Plan加速SQL执行支持TIME和TIMETZ类型。

  • 结果表:Flink引擎VVR-4.0.13-Flink-1.13版本开始支持,RPC模式暂不支持。

    说明

    由于Fixed Plan暂不支持TIME类型,暂不推荐使用该类型,详情请参见Fixed Plan加速SQL执行

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:Flink引擎VVR-4.0.13-Flink-1.13版本开始支持,RPC模式暂不支持。

VARCHAR

JSONB

Hologres 0.10新增

  • 结果表:Flink引擎VVR-4.0.12-Flink-1.13版本开始支持,RPC模式暂不支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:Flink引擎VVR-4.0.12-Flink-1.13版本开始支持,RPC模式暂不支持。

VARCHAR

JSON

Hologres 0.9新增

  • 结果表:Flink引擎VVR-4.0.12-Flink-1.13版本开始支持,RPC模式暂不支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:Flink引擎VVR-4.0.12-Flink-1.13版本开始支持,RPC模式暂不支持。

BYTES

RoaringBitmap

Hologres 0.10新增

  • 结果表:Flink引擎VVR-4.0.12-Flink-1.13版本开始支持,RPC模式暂不支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:Flink引擎VVR-4.0.12-Flink-1.13版本开始支持,RPC模式暂不支持。

VARCHAR

GEOMETRY和GEOGRAPHY

Hologres所有版本

说明

Hologres V2.1版本起,Fixed Plan加速SQL执行支持TGEOMETRY和GEOGRAPHY类型的数据写入。

  • 结果表:Flink引擎VVR-4.0.13-Flink-1.13版本开始支持,RPC模式暂不支持。

  • 源表:暂不支持。

  • 维表:暂不支持。

TINYINT

SMALLINT

Hologres所有版本

  • 结果表:Flink引擎VVR-4.0.13-Flink-1.13版本开始支持,RPC模式暂不支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:Flink引擎VVR-4.0.13-Flink-1.13版本开始支持,RPC模式暂不支持。

SMALLINT

SMALLINT

Hologres所有版本

  • 结果表:所有版本支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:所有版本支持。

ARRAY<INT>

int4[]

Hologres 0.8新增

  • 结果表:所有版本支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:所有版本支持。

ARRAY<BIGINT>

int8[]

Hologres 0.8新增

  • 结果表:所有版本支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:所有版本支持。

ARRAY<FLOAT>

float4[]

Hologres 0.8新增

  • 结果表:所有版本支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:所有版本支持。

ARRAY<DOUBLE>

float8[]

Hologres 0.8新增

  • 结果表:所有版本支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:所有版本支持。

ARRAY<BOOLEAN>

boolean[]

Hologres 0.8新增

  • 结果表:所有版本支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:所有版本支持。

ARRAY<VARCHAR>

TEXT[]

Hologres 0.8新增

  • 结果表:所有版本支持。

  • 源表:Flink引擎VVR-6.0.3-Flink-1.15版本开始支持,RPC模式暂不支持。

  • 维表:所有版本支持。

CHAR

不支持

不支持

不支持

BINARY

不支持

不支持

不支持

MySQL与Hologres数据类型映射

MySQL与Hologres数据类型映射如下表所示,关于MySQL迁移至Hologres的详情请参见迁移MySQL至Hologres

MySQL数据类型

Hologres数据类型

BIGINT

BIGINT

BINARY(n)

BYTEA

BIT

BOOLEAN

  • CHAR(n)

  • CHARACTER(n)

  • CHAR(n)

  • CHARACTER(n)

DATE

DATE

DATETIME

TIMESTAMP [WITHOUT TIME ZONE]

  • DECIMAL(p,s)

  • DEC(p,s)

  • DECIMAL(p,s)

  • DEC(p,s)

DOUBLE

DOUBLE PRECISION

FLOAT

REAL

  • INT

  • INTEGER

  • INT

  • INTEGER

MEDIUMINT

INTEGER

NUMERIC(p,s)

NUMERIC(p,s)

SMALLINT

SMALLINT

  • TINYBLOB

  • BLOB

  • MEDIUMBLOB

  • LONGBLOB

BYTEA

TINYINT

SMALLINT

  • TINYTEXT

  • TEXT

  • MEDIUMTEXT

  • LONGTEXT

TEXT

TIME

TIME [WITHOUT TIME ZONE]

TIMESTAMP

TIMESTAMP [WITH TIME ZONE]

  • VARBINARY(n)

  • VARBINARY(max)

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>

支持的类型如下:

  • INT

  • BIGINT

  • FLOAT

  • BOOLEAN

  • DOUBLE

  • STRING

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>

支持的类型如下:

  • INT

  • BIGINT

  • FLOAT

  • BOOLEAN

  • DOUBLE PRECISION

  • STRING

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>

支持类型如下:

  • INT

  • BIGINT

  • FLOAT

  • BOOLEAN

  • DOUBLE PRECISION

  • STRING

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>

支持类型如下:

  • INT

  • BIGINT

  • FLOAT

  • BOOLEAN

  • DOUBLE PRECISION

  • STRING

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>

支持类型如下:

  • INT

  • BIGINT

  • FLOAT

  • BOOLEAN

  • DOUBLE PRECISION

  • STRING

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>

支持类型如下:

  • INT

  • BIGINT

  • FLOAT

  • BOOLEAN

  • DOUBLE PRECISION

  • STRING

STRUCT

不支持

MAP

不支持