GBase8a 数据类型 --- 二进制、日期及时间类型
二进制数据类型
GBase 8a MPP Cluster 目前支持以下二进制数据类型,如下表所示:
表 二进制数据类型
| 类型名称 | 最大长度(字节) |
| BLOB | 32767 |
| LONGBLOB | 67108864 |
使用 BLOB 数据类型,有如下约束:
BLOB 列支持 32KB 的存储容量。
创建表时,BLOB 列不可以有 DEFAULT 值。
查询语句中,BLOB 列不支持过滤条件。
查询语句中,BLOB 列不支持 OLAP 函数。
日期和时间类型
GBase 8a MPP Cluster 支持的日期和时间类型。
表 日期和时间类型
| 类型名称 | 最小值 | 最大值 | 格式 |
| DATE | 0001-01-01 | 9999-12-31 | YYYY-MM-dd |
| DATETIME | 0001-01-01 00:00:00.000000 | 9999-12-31 23:59:59.999999 | YYYY-MM-dd HH:MI:SS.ffffff |
| TIME | -838:59:59 | 838:59:59 | HHH:MI:SS |
| TIMESTAMP | 1970-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 表和系统表不受该参数控制,且该参数没有针对单机开发,单机未测试,单机使用需谨慎。
评论
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25052
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526