GBase 8a
运维管理
文章

GBase8a 数据类型 --- 二进制、日期及时间类型

发表于2025-09-30 13:33:1544次浏览3个评论

二进制数据类型

GBase 8a MPP Cluster 目前支持以下二进制数据类型,如下表所示:

表  二进制数据类型

类型名称最大长度(字节)
BLOB32767
LONGBLOB67108864

使用 BLOB 数据类型,有如下约束:

BLOB 列支持 32KB 的存储容量。

创建表时,BLOB 列不可以有 DEFAULT 值。

查询语句中,BLOB 列不支持过滤条件。

查询语句中,BLOB 列不支持 OLAP 函数。

日期和时间类型

GBase 8a MPP Cluster 支持的日期和时间类型。

表  日期和时间类型

类型名称最小值最大值格式
DATE0001-01-019999-12-31YYYY-MM-dd
DATETIME0001-01-01
00:00:00.000000
9999-12-31
23:59:59.999999
YYYY-MM-dd
HH:MI:SS.ffffff
TIME-838:59:59838:59:59HHH:MI:SS
TIMESTAMP1970-01-01
08:00:01
2038-01-01
00:59:59
YYYY-MM-DD
HH:MI:SS

 

当使用日期和时间类型时,用户应当提供正确的格式,如:YYYY-MM-DD、YYYY-MM-DD HH:MI:SS。

DATE

日期类型。支持的范围是“0001-01-01”到“9999-12-31”。

GBase 8a MPP Cluster 以“YYYY-MM-DD”格式显示 DATE 值。

示例

示例 1:插入一个标准的 DATE 值。

gbase> CREATE TABLE products (productDate DATE);

Query OK, 0 rows affected

gbase> INSERT INTO products(productDate) VALUES('2010-09-01');

Query OK, 1 row affected

gbase> SELECT productDate FROM products;

+-------------+

| productDate |

+-------------+

| 2010-09-01 |

+-------------+
1 row in set

示例 2:插入一个 NULL 值。

gbase> CREATE TABLE products (productDate DATE);

Query OK, 0 rows affected

gbase> INSERT INTO products(productDate) VALUES('2010-09-01');

Query OK, 1 row affected

gbase> SELECT productDate FROM products;

+-------------+

| productDate |

+-------------+

| 2010-09-01 |

+-------------+

1 row in set

示例 3:插入一个非法的 DATE 值,系统报告错误信息。

gbase> CREATE TABLE products (productDate DATE);

Query OK, 0 rows affected

gbase> INSERT INTO products(productDate) VALUES('2010-09-31');

ERROR 1292 (22007): Incorrect date value: '2010-09-31' for column 'productDate'

at row 1

TIME

GBase 8a MPP Cluster 以“HH:MM:SS”格式(或“HHH:MM:SS”格式)检索和

显示 TIME 值,该值为字符串。TIME 的范围是“-838:59:59”到“838:59:59”。TIME 类型不仅可以用于表示一天的时间,而且可以用来表示所经过的时间或两个事件之间的时间间隔(这可能比 24 小时大许多或是一个负值)。

对于以字符串指定的包含时间界定符的 TIME 值, 小于 10 的时、 分或秒, 可以不指定为两位数值。

“8:3:2”与“08:03:02”是一致的。TIME 值可以多种格式指定:一个'D HH:MM:SS.fraction'格式的字符串。下面所示的任一种“宽松”的语法均可以被使用:

‘HH:MM:SS.fraction’,'HH:MM:SS','HH:MM','D HH:MM:SS','D HH:MM','D HH',或'SS'。这里的 D 是一个在 0-34 之间的天数。注意,fraction

部分可以精确到微秒。

示例

示例 1:插入一个标准的 TIME 值。

gbase> CREATE TABLE products (producttime TIME);

Query OK, 0 rows affected

gbase> INSERT INTO products(producttime) VALUES('12:35:23');

Query OK, 1 row affected

gbase> SELECT producttime FROM products;

+-------------+

| producttime |

+-------------+

| 12:35:23 |

+-------------+

1 row in set

示例 2:插入一个 NULL 值。

gbase> CREATE TABLE products (producttime TIME);

Query OK, 0 rows affected

gbase> INSERT INTO products(producttime) VALUES(NULL);

Query OK, 1 row affected

gbase> SELECT producttime FROM products;

+-------------+

| producttime |

+-------------+

| NULL |

+-------------+

1 rows in set

示例 3:插入一个非法的 TIME 值,系统报告错误信息。

gbase> CREATE TABLE products (producttime TIME);

Query OK, 0 rows affected

gbase> INSERT INTO products(producttime) VALUES('14:08:89');

ERROR 1292 (22007): Incorrect time value: '14:08:89' for column 'producttime' at row 1

DATETIME

GBase 8a MPP Cluster 以“YYYY-MM-DD HH:MI:SS.fraction”格式显示DATETIME 值。其中 fraction 表示微秒格式,最大支持 6 位数字。

日期和时间的组合类型。支持的范围是“0001-01-01 00:00:00.000000”到“9999-12-31 23:59:59.999999”

示例

示例 1:插入一个合法的 DATETIME 值。

gbase> CREATE TABLE products (productDate DATETIME);

Query OK, 0 rows affected

gbase> INSERT INTO products(productDate) VALUES('2010-09-01

12:09:44');

Query OK, 1 row affected

gbase> SELECT productDate FROM products;

+---------------------+

| productDate |

+---------------------+

| 2010-09-01 12:09:44 |

+---------------------+

1 row in set

示例 2:插入系统当前的 DATETIME 值。

gbase> INSERT INTO products(productDate) VALUES(NOW());

Query OK, 1 row affected

gbase> SELECT productDate FROM products;

+---------------------+

| productDate |

+---------------------+

| 2013-10-16 17:51:38 |

+---------------------+

1 row in set

示例 3:插入一个 NULL 值。

gbase> INSERT INTO products(productDate) VALUES(NULL);

Query OK, 1 row affected

gbase> SELECT productDate FROM products;

+-------------+

| productDate |

+-------------+

| NULL |

+-------------+

1 row in set

示例 4:插入一个带有微秒的 DATETIME 数值。

gbase> INSERT INTO products(productDate) VALUES('2013-09-15

12:09:44.123456');

Query OK, 1 row affected

gbase> SELECT productDate FROM products;

+----------------------------+

| productDate |

+----------------------------+

| 2013-09-15 12:09:44.123456 |

+----------------------------+

1 row in set

示例 5:插入一个非法的 DATETIME 值,系统将报告错误信息。

gbase> INSERT INTO products(productDate) VALUES('2010-09-31

12:09:44');

ERROR 1292 (22007): Incorrect datetime value: '2010-09-31 12:09:44' for column 'productDate' at row 1

TIMESTAMP

TIMESTAMP 类型仅仅是为了兼容 SQL 标准, 不建议使用此数据类型, 推荐使用DATETIME 数据类型。

TIMESTAMP 的格式为 “YYYY-MM-DD HH:MI:SS”08:00:01”到“2038-01-01 00:59:59”。, 支持的范围是 “1970-01-01 如需 Timestamp 支持精度到微秒,需要开启参数:

_gbase_timestamp_append_prec

默认值为 OFF(0),timestamp 精度支持到秒,如果插入的数据带有微秒,也只保存

到秒,微秒丢弃,无法查询。

值设置为 1 时代表开启微秒精度, timestamp 精度支持到微秒, 如果数据带有微秒,

保存 6 位(0~999999),不足 6 位以 0 补足 6 位。

Timestamp 开启微秒精度后,DQL、DML、insert select 、导入导出中均支持操作

六位精度类型,dblink 访问远端数据表带精度的数据精度可以被保留。并在如下时间函数中支持指定精度:

current_timestamp、localtime、localtimestamp、now 及 sysdate

gbase> CREATE TABLE t (a int,b timestamp DEFAULT CURRENT TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, c timestamp DEFAULT '2013-01-01 00:00:01');

Query OK, 0 rows affected

gbase> SHOW CREATE TABLE t;

+-------+----------------------------------------------------------------+

| Table | Create Table|

+-------+----------------------------------------------------------------+

| t | CREATE TABLE "t" (

"a" int(11) DEFAULT NULL,

"b" timestamp NOT NULL DEFAULT CURRENT_ TIMESTAMP ON  UPDATE CURRENT_TIMESTAMP,

"c" timestamp NOT NULL DEFAULT '2013-01-01 00:00:01'

) ENGINE=EXPRESS DEFAULT CHARSET=utf8

TABLESPACE='sys_tablespace' |

+-------+----------------------------------------------------------------+

1 row in set

gbase> show variables like '_gbase_timestamp_append%';

+------------------------------+-------+

| Variable_name | Value |

+------------------------------+-------+

| _gbase_timestamp_append_prec | OFF |

+------------------------------+-------+

gbase> create table t(a int,b timestamp);

Query OK, 0 rows affected (Elapsed: 00:00:02.19)

gbase> insert into t values(1,now());

Query OK, 1 row affected (Elapsed: 00:00:00.86)

gbase> insert into t values(2,

'2021-3-4 12:12:12.123456');

Query OK, 1 row affected (Elapsed: 00:00:00.17)

gbase> select * from t;

+------+---------------------+

| a | b |

+------+---------------------+

| 1 | 2021-04-05 14:42:41 |

| 2 | 2021-03-04 12:12:12 |

+------+---------------------+

2 rows in set (Elapsed: 00:00:01.11)

gbase> show variables like '%_gbase_timestamp_append_prec%';

+------------------------------+-------+

| Variable_name | Value |

+------------------------------+-------+

| _gbase_timestamp_append_prec | ON |

+------------------------------+-------+

gbase> update t set b='2021-03-04 15:12:12.123';

Query OK, 4 rows affected (Elapsed: 00:00:00.07)

Rows matched: 4 Changed: 4 Warnings: 0

gbase> select * from t;

+------+----------------------------+

| a | b |

+------+----------------------------+

| 1 | 2021-03-04 15:12:12.123000 |

| 2 | 2021-03-04 15:12:12.123000 |

| 3 | 2021-03-04 15:12:12.123000 |

| 4 | 2021-03-04 15:12:12.123000 |

+------+----------------------------+

4 rows in set (Elapsed: 00:00:00.03)

gbase> insert into t values(5,now());

Query OK, 1 row affected (Elapsed: 00:00:00.41)

gbase> select * from t;

+------+----------------------------+

| a | b |

+------+----------------------------+

| 1 | 2021-03-04 15:12:12.123000 |

| 2 | 2021-03-04 15:12:12.123000 |

| 3 | 2021-03-04 15:12:12.123000 |

| 4 | 2021-03-04 15:12:12.123000 |

| 5 | 2021-04-05 14:55:49 |

+------+----------------------------+

5 rows in set (Elapsed: 00:00:00.02)

gbase> insert into t values(6,now(3));

Query OK, 1 row affected (Elapsed: 00:00:00.34)

gbase> select * from t;

+------+----------------------------+

| a | b |

+------+----------------------------+

| 1 | 2021-03-04 15:12:12.123000 |

| 2 | 2021-03-04 15:12:12.123000 |

| 3 | 2021-03-04 15:12:12.123000 |

| 4 | 2021-03-04 15:12:12.123000 |

| 5 | 2021-04-05 14:55:49 |

| 6 | 2021-04-05 14:56:03.737000 |

+------+----------------------------+

6 rows in set (Elapsed: 00:00:00.03)

gbase> insert into t values(7,now(6));

Query OK, 1 row affected (Elapsed: 00:00:00.07)

gbase> select * from t;

+------+----------------------------+

| a | b |

+------+----------------------------+

| 1 | 2021-03-04 15:12:12.123000 |

| 2 | 2021-03-04 15:12:12.123000 |

| 3 | 2021-03-04 15:12:12.123000 |

| 4 | 2021-03-04 15:12:12.123000 |

| 5 | 2021-04-05 14:55:49 |

| 6 | 2021-04-05 14:56:03.737000 |

| 7 | 2021-04-05 14:56:18.279518 |

+------+----------------------------+

7 rows in set (Elapsed: 00:00:00.02)

TIMESTAMP 使用限制

以下限制说明,是针对 TIMESTAMP 数据列自动更新时的场景:

使用 DEFAULT CURRENT TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 属性后,TIMESTAMP 列在支持 INSERT、UPDATE 以及 MERGE 时,它的值自

动更新。创建表时,一个表中可以定义一个或多个 TIMESTAMP 列,如果仅定义1 个,那么 DEFAULT CURRENT TIMESTAMP ON UPDATE_CURRENT_TIMESTAMP 属性在创建时可以不予指定,系统会自动填加。如果需要定义多列,那么第一个 TIMESTAMP 列必须指定 DEFAULT CURRENT TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 属性,而后面其他 TIMESTAMP 列不能指定 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 属性。

注意

参数_gbase_timestamp_append_prec 是只读参数,且一旦值置为 1 后不允许再置回到 0,修改该参数需要到所有节点的配置文件中修改后重启服务起效,修改建

议将参数添加到 gcluster/config/gbase8a__gcluster.cnf 和gnode/config/gbase_8a__gbase.cnf 的[gbased]标签下,修改如下:

_gbase_timestamp_append_prec=1

GSSYS 表和系统表不受该参数控制,且该参数没有针对单机开发,单机未测试,单机使用需谨慎。

评论

登录后才可以发表评论
用户头像
郝老师发表于 10个月前
建议给出二进制的示例
GBase用户21143发表于 10个月前
优秀,感谢分享。
用户头像
GBase用户28017发表于 9个月前
了解。