其他分享
首页 > 其他分享> > GBase 8s MPP数据类型

GBase 8s MPP数据类型

作者:互联网

GBase 8s MPP Cluster支持SQL92中定义的绝大多数数据类型,同时也支持SQL99和SQL2000中定义的数据类型。

GBase 8s MPP Cluster支持的数据类型,如下表所示:

GBase 8s MPP Cluster的数据类型

数值型

TINYINT

SMALLINT

INT

BIGINT

FLOAT

DOUBLE

DECIMAL

字符型

CHAR

VARCHAR

TEXT

二进制类型

BLOB

日期和时间型

DATE

DATETIME

TIME

TIMESTAMP

    1. 数值类型

GBase 8s MPP Cluster支持数据类型包括严格的数值数据类型(TINYINT,SMALLINT,INT,BIGINT,DECIMAL),以及近似的数值数据类型(FLOAT,DOUBLE)。

为了更有效地使用存储空间,请用户尽量使用最精确的类型。例如,如果一个整数列被用于在1~127之间的值,TINYINT是最好的类型。

为了存储更大范围的数值,用户可以选择BIGINT或DECIMAL类型。

作为SQL92标准的扩展,GBase 8s MPP Cluster也支持整数类型TINYINT,SMALLINT和BIGINT。

GBase 8s MPP Cluster支持的数值类型,如下表所示:

类型名称

最小值

最大值

占用字节数

TINYINT

-128

127

1

SMALLINT

-32767

32767

2

INT(INTEGER)

-2147483647

2147483647

4

BIGINT

-9223372036854775807

9223372036854775807

8

FLOAT

-3.40E+38

3.40E+38

4

DOUBLE

-1.797693134862315E+308

1.797693134862315E+308

8

DECIMAL[(M[, D])]

-(1E+M -1)/(1E+D)

(1E+M -1)/(1E+D)

动态计算

      1. TINYINT

整数类型,它的范围是-128到127,TINYINT占用1个字节。

      1. SMALLINT

整数类型。它的范围是-32767到32767,SMALLINT占用2个字节。

      1. INT

整数类型。INTEGER的同义词。它的范围是-2147483647到2147483647,INT占用4个字节。

      1. BIGINT

整数类型。它的范围是-9223372036854775807到9223372036854775807,BIGINT占用8个字节。

示例1:定义的列数据类型为BIGINT。

示例中用到的表及数据:

CREATE TABLE products(productnum BIGINT);

INSERT INTO products(productnum) VALUES(100);

gbase> SELECT productnum FROM products;

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

| productnum |

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

|        100 |

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

1 row in set

      1. FLOAT

FLOAT代表一个浮点型数值,占用4个字节,它所存储的数值不是一个准确值。允许的值是-3.402823466E+38到-1.175494351E-38,0,1.175494351E-38到3.402823466E+38。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

GBase 8s允许在关键字FLOAT后面的括号内选择用位指定精度,即FLOAT(X)。0到23的精度对应FLOAT列的4字节单精度,24到53的精度对应DOUBLE列的8字节双精度。当24<=X<=53时,FLOAT(X)与DOUBLE(X)等价。

同时GBase 8s允许使用非标准语法FLOAT(M,D)(M是整数位数和小数位数的总位数,D是小数的个数),GBase 8s保存值时进行五舍六入。

示例1:定义的列数据类型为FLOAT。

示例中用到的表及数据:

CREATE TABLE products(productnum FLOAT);

INSERT INTO products(productnum) VALUES(-19000.44365);

INSERT INTO products(productnum) VALUES(-19000.48365);

INSERT INTO products(productnum) VALUES(1.44365);

INSERT INTO products(productnum) VALUES(1.443658);

gbase> SELECT productnum FROM products;

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

| productnum |

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

|   -19000.4 |

|   -19000.5 |

|    1.44365 |

|    1.44366 |

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

4 rows in set

示例2:定义的列数据类型为FLOAT(M),总位数小于等于23时,小数部分只保留一位有效数字,系统会自动对数字进行四舍五入。

定义的列数据类型为FLOAT(M),总位数大于23时,小数位最大支持15位数字。

示例中用到的表及数据:

CREATE TABLE products (a FLOAT(20),b FLOAT(28));

INSERT INTO products (a,b) VALUES(-19000.44365,-19000.44365);

gbase> SELECT * FROM products;

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

| a        | b            |

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

| -19000.4 | -19000.44365 |

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

1 row in set

示例3:定义的列数据类型为FLOAT(20,5),指定精度为5,则小数部分保留5位数字。

示例中用到的表及数据:

CREATE TABLE products(productnum FLOAT(20,5));

INSERT INTO products(productnum) VALUES(19000.44365);

INSERT INTO products(productnum) VALUES(19000.443652);

gbase> SELECT productnum FROM products;

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

| productnum  |

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

| 19000.44336 |

| 19000.44336 |

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

2 rows in set

示例4:定义的列数据类型为FLOAT(7,4),插入的数据为999.00009时,其近似值就是999.0001,自动四舍五入。

示例中用到的表及数据:

CREATE TABLE products(productnum FLOAT(7,4));

INSERT INTO products(productnum) VALUES(999.00009);

gbase> SELECT productnum FROM products;

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

| productnum |

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

|   999.0001 |

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

1 row in set

      1. DOUBLE

DOUBLE代表一个浮点型数值,占用8个字节,它所存储的数值不是一个准确值。允许的值是-1.797693134862315E+308到-2.2250738585072014E-308、0、2.2250738585072014E-308到1.797693134862315E+308。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

GBase 8s允许在关键字DOUBLE后面的括号内选择用位指定精度,即DOUBLE (X)。0到23的精度对应FLOAT列的4字节单精度,24到53的精度对应DOUBLE列的8字节双精度。当24<=X<=53时,FLOAT(X)与DOUBLE(X)等价。

同时GBase 8s允许使用非标准语法DOUBLE(M,D)(M是整数位数和小数位数的总位数,D是小数的个数),GBase 8s保存值时进行四舍五入。

示例1:定义的列数据类型为DOUBLE。

示例中用到的表及数据:

CREATE TABLE products(productnum DOUBLE);

INSERT INTO products(productnum) VALUES(-19000.44365);

gbase>DESC products;

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

| Field      | Type   | Null | Key | Default | Extra |

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

| productnum | double | YES  |     | NULL    |       |

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

1 row in set

gbase> SELECT productnum FROM products;

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

| productnum   |

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

| -19000.44365 |

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

1 row in set

      1. DECIMAL

DECIMAL[(M[, D])]代表一个精确值,它所存储的数值范围是-(1E+M -1)/(1E+D)到(1E+M -1)/(1E+D)。

在DECIMAL[(M[, D])]数据类型中,M是总位数,支持的最大长度为32;D是小数点后面的位数,支持的最大长度为30。

在不需要过高的数字精度的场景中,DECIMAL中的M可以定义为M≤18,这样可以获得更好的查询性能。

DECIMAL用来存储那些严格要求数字精度的数据,例如货币数据,在这种情况下需要指定精度:

salary DECIMAL(5,2)

在DECIMAL(5,2)中,5表示总位数(整数位和小数位的位数总和),2是小数位数。可以存储在salary列的最小值是-999.99,最大值是999.99。

DECIMAL值的最大范围受限于给定的精度和小数范围。超过小数范围时,会按四舍五入的原则截断为设定小数位数。

在定义DECIMAL数据列时,如果M和D同时省略,则M取值为10,D取值为0,即DECIMAL(10,0),如果只指定M值,省略D值,那么插入一个非整数值的数字时,将按照四舍五入的原则截取到整数位。

示例1:定义的列数据类型为DECIMAL(18,5)。

示例中用到的表及数据:

CREATE TABLE products(productnum DECIMAL(18,5));

INSERT INTO products(productnum) VALUES(19000.44365);

gbase> DESC products;

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

| Field      | Type          | Null | Key | Default | Extra |

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

| productnum | decimal(18,5) | YES  |     | NULL    |       |

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

1 row in set

gbase> SELECT productnum FROM products;

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

| productnum  |

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

| 19000.44365 |

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

1 row in set

示例2:定义的列数据类型为DECIMAL,M和D均省略,那么M默认值为10,D默认值为0。

gbase> CREATE TABLE products(productnum DECIMAL);

Query OK, 0 rows affected

gbase> DESC products;

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

| Field      | Type          | Null | Key | Default | Extra |

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

| productnum | decimal(10,0) | YES  |     | NULL    |       |

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

1 row in set

示例3:定义列数据类型为DECIMAL(M,D),插入的数据超出总位数M时,报告错误信息;超出精度D时,则小数部分四舍五入。

gbase> CREATE TABLE products(productnum DECIMAL(8,3));

Query OK, 0 rows affected

gbase> INSERT INTO products(productnum) VALUES(191220.443);

ERROR 1264 (22003): Out of range value for column 'productnum' at row 1

gbase> INSERT INTO products(productnum) VALUES(19122.4436);

Query OK, 1 row affected, 1 warning

gbase> SELECT productnum FROM products;

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

| productnum |

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

|  19122.444 |

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

1 row in set

      1. NUMERIC

NUMERIC数据类型与DECIMAL数据类型完全等价。

    1. 字符类型

GBase 8s MPP Cluster目前支持三种字符类型,如下表所示:

类型名称

最大长度(字符)

CHAR

255

VARCHAR

10922(utf8)、16383(gbk)

TEXT

4294967295

      1. CHAR

CHAR(m)

CHAR类型仅仅是为了兼容SQL标准,因此,不建议使用者在实际的项目应用场景使用此数据类型,建议使用VARCHAR数据类型。

CHAR是CHARACTER的缩写。m表示该列中字符串的长度,其范围是1到255个字符。

当存储的字符长度小于指定的长度m时,在字符串右边用空格补齐。

当读取CHAR值时,填充的空格依旧保留。

如果给一个定义为CHAR类型的列插入一个超出最大长度的字符串,那么系统将报告错误信息。

      1. VARCHAR

VARCHAR(m)

变长字符串,m表示该列中串的长度,其范围是1到10922个字符。

当存储VARCHAR类型的数据时,不会用空格填充补足列定义长度,存储的数据包含空格时,保留空格。

示例1:VARCHAR数据类型不会补足列定义的长度,但会保留插入的数据中的空格。

示例中用到的表及数据:

CREATE TABLE products (productName VARCHAR(100));

INSERT INTO products(productName) VALUES('南大通用');

INSERT INTO products(productName) VALUES('  南大通用');;

gbase> SELECT productName,  LENGTH(productName) AS length, CHAR_LENGTH(productName) AS char_length FROM products;

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

| productName    | length | char_length |

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

| 南大通用       |     12 |           4 |

|   南大通用     |     14 |           6 |

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

2 rows in set

gbase> SELECT productName FROM products WHERE productName = '南大通用';

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

| productName  |

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

| 南大通用     |

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

1 row in set

查询结果中保留原始数据中的空格:

gbase> SELECT productName FROM products WHERE productName = '  南大通用';

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

| productName    |

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

|   南大通用     |

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

1 row in set

      1. TEXT

TEXT类型仅仅是为了兼容其它数据库的类型,推荐使用VARCHAR类型。

TEXT类型最大支持10922字符的存储长度,定义TEXT列时,不能为它指定DEFAULT值。

    1. 二进制数据类型

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

类型名称

最大长度(字节)

BLOB

32767

LONGBLOB

67108864

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

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

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

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

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

    1. 日期和时间类型

GBase 8s 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

00:00:00

23:59:59

HHH:MI:SS

TIMESTAMP

1970-01-01 08:00:01

2038-01-19 11:14:07

YYYY-MM-DD HH:MI:SS

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

      1. DATE

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

GBase 8s 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(NULL);

Query OK, 1 row affected

gbase> SELECT productDate FROM products;

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

| productDate |

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

| NULL        |

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

1 rows 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

      1. TIME

GBase 8s MPP Cluster以“HH:MI:SS”格式(或“HHH:MI:SS”格式)检索和显示TIME值,该值为字符串。

TIME的范围是“00:00:00”到“23:59:59”。TIME类型可以用于表示一天的时间。

对于以字符串指定的包含时间定界符的TIME值,小于10的时、分或秒,可以不指定为两位数值。“8:3:2”与“08:03:02”是一致的。

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

gbase> CREATE TABLE products (productDate TIME);

Query OK, 0 rows affected

gbase>INSERT INTO products(productDate) VALUES('12:09:44');

Query OK, 1 row affected

gbase> SELECT productDate FROM products;

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

| productDate |

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

| 12:09:44    |

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

1 row in set

示例2:插入一个在“-838:59:59”到“838:59:59”之间,且超过24小时之间的TIME值。

gbase> CREATE TABLE products (productDate TIME);

Query OK, 0 rows affected

gbase>INSERT INTO products(productDate) VALUES('92:09:44');

Query OK, 1 row affected

gbase> SELECT productDate FROM products;

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

| productDate |

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

| 92:09:44    |

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

1 row in set

      1. DATETIME

GBase 8s MPP Cluster以“YYYY-MM-DD HH:MI:SS.ffffff”格式显示DATETIME值。其中ffffff表示微秒格式。

日期和时间的组合类型。支持的范围是“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:插入系统当前的DATATIME值。

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.123450 |

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

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

      1. TIMESTAMP

TIMESTAMP类型仅仅是为了兼容SQL标准,因此,不建议使用者在实际的项目应用场景使用此数据类型,推荐使用DATETIME数据类型。

TIMESTAMP的格式为“YYYY-MM-DD HH:MI:SS”,支持的范围是“1970-01-01 08:00:01”到“2038-01-19 11:14:07”。

例如:

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

TIMESTAMP使用限制:

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

使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性后,TIMESTAMP列在支持INSERT、UPDATE以及MERGE时,它的值自动更新。需要注意的是DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP在一张表中只能给第一个TIMESTAMP列使用一次,也就是含有多个TIMESTAMP列时,只能给第一次出现TIMESTAMP列使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性。

创建一张表时,如果只定义一个TIMESTAMP列,则DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP可以省略,系统会自动添加上。

从不同节点发起的SQL语句,TIMESTAMP列更新的时间为发起节点的本地时间;如果从不同的发起点发起SQL,而各个节点的本地时间又不同步,则无法保证TIMESTAMP列更新值一致。

标签:productnum,示例,数据类型,gbase,productDate,products,8s,GBase,row
来源: https://blog.csdn.net/weixin_57486087/article/details/122612517