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
FLOAT(别名FLOAT4) Hologres所有版本 4字节 可变精度,不精确。 精度为15位的十进制数字。 123.3333
DOUBLE PRECISION(别名FLOAT8) Hologres所有版本 8字节 可变精度,不精确。 精度为15位的十进制数字。 123.3333
TEXT(别名VARCHAR) Hologres所有版本 可变长 可变长度字符串。 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
SMALLINT Hologres 0.9版本新增 2字节 小范围整数 -32768~+32767 32767
JSON和JSONB Hologres 0.9版本新增 详情请参见JSON和JSONB类型
BYTEA Hologres 0.9版本新增 可变长,详情请参见Binary Data Types 可变长的二进制串。 存储字节不超过1 GB。
BIT(n) Hologres 0.9版本新增 长度为n个bit的二进制串 固定长度的二进制串。 存储字节不超过1 GB。
VARBIT(n) Hologres 0.9版本 可变长,长度不超过n个bit的二进制串 有限bit长度的二进制串 存储字节不超过1GB。
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精确到毫秒。
MaxCompute与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的CHAR(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的SMALLINT为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不访问该字段,则可以正常查询所支持的类型字段。

批量创建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所有版本
DATETIME TIMESTAMP WITH TIME ZONE Hologres所有版本
DECIMAL NUMERIC Hologres所有版本
BOOLEAN BOOL Hologres所有版本
TIMESTAMP TIMESTAMP WITH TIME ZONE Hologres 0.8版本新增
CHAR(n) CHAR(n) Hologres 0.8版本新增
VARCHAR(n) VARCHAR(n) Hologres 0.8版本新增
TINYINT INT2 Hologres所有版本(0.8版本为 int4, 0.9版本为int2)
SMALLINT INT2 Hologres所有版本(0.8版本为 int4, 0.9版本为int2)
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版本新增
CHAR 不支持 Hologres 0.9版本新增支持
BINARY 不支持 不支持
ARRAY<TINYINT> 不支持 不支持
ARRAY<SMALLINT> 不支持 不支持

实时计算与Hologres的数据类型映射

实时计算与Hologres的数据类型映射如下表所示。

实时计算数据类型 Hologres数据类型 支持映射的版本
VARCHAR TEXT Hologres所有版本
BIGINT INT8 Hologres所有版本
INT
  • INT4
  • INT
Hologres所有版本
SMALLINT
  • INT4
  • INT
Hologres所有版本
TINYINT
  • INT4
  • INT
Hologres所有版本
FLOAT
  • FLOAT4
  • REAL
Hologres所有版本
DOUBLE
  • FLOAT
  • FLOAT8
Hologres所有版本
BOOLEAN BOOL Hologres所有版本
TIMESTAMP TIMESTAMP WITH TIME ZONE Hologres所有版本
DATE DATE Hologres 0.8新增
DECIMAL NUMERIC Hologres所有版本
TIME 不支持 不支持
CHAR 不支持 不支持
BINARY 不支持 不支持