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 |
-
- 数值类型
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) | 动态计算 |
-
-
- TINYINT
-
整数类型,它的范围是-128到127,TINYINT占用1个字节。
-
-
- SMALLINT
-
整数类型。它的范围是-32767到32767,SMALLINT占用2个字节。
-
-
- INT
-
整数类型。INTEGER的同义词。它的范围是-2147483647到2147483647,INT占用4个字节。
-
-
- 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
-
-
- 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
-
-
- 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
-
-
- 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
-
-
- NUMERIC
-
NUMERIC数据类型与DECIMAL数据类型完全等价。
-
- 字符类型
GBase 8s MPP Cluster目前支持三种字符类型,如下表所示:
类型名称 | 最大长度(字符) |
CHAR | 255 |
VARCHAR | 10922(utf8)、16383(gbk) |
TEXT | 4294967295 |
-
-
- CHAR
-
CHAR(m)
CHAR类型仅仅是为了兼容SQL标准,因此,不建议使用者在实际的项目应用场景使用此数据类型,建议使用VARCHAR数据类型。
CHAR是CHARACTER的缩写。m表示该列中字符串的长度,其范围是1到255个字符。
当存储的字符长度小于指定的长度m时,在字符串右边用空格补齐。
当读取CHAR值时,填充的空格依旧保留。
如果给一个定义为CHAR类型的列插入一个超出最大长度的字符串,那么系统将报告错误信息。
-
-
- 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
-
-
- TEXT
-
TEXT类型仅仅是为了兼容其它数据库的类型,推荐使用VARCHAR类型。
TEXT类型最大支持10922字符的存储长度,定义TEXT列时,不能为它指定DEFAULT值。
-
- 二进制数据类型
GBase 8s MPP Cluster目前支持以下二进制数据类型,如下表所示:
类型名称 | 最大长度(字节) |
BLOB | 32767 |
LONGBLOB | 67108864 |
使用BLOB数据类型,有如下约束:
BLOB列支持32KB的存储容量。
创建表时,BLOB列不可以有DEFAULT值。
查询语句中,BLOB列不支持过滤条件。
查询语句中,BLOB列不支持OLAP函数。
-
- 日期和时间类型
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。
-
-
- 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
-
-
- 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
-
-
- 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
-
-
- 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