GBase 8a MPP Cluster 支持数据类型包括严格的数值数据类型(TINYINT,SMALLINT, INT, BIGINT, DECIMAL, NUMERIC),以及近似的数值数据类型( FLOAT,DOUBLE)。
为了更有效地使用存储空间,请用户尽量使用最精确的类型。例如,需要一个整数列的值在 1~127 之间, TINYINT 是最好的类型。
作为 SQL92 标准的扩展, GBase 8a MPP Cluster 也支持整数类型 TINYINT,SMALLINT 和 BIGINT。
GBase 8a MPP Cluster 支持的数值类型,如下表所示:
TINYINT
整数类型。它的范围是-127 到 127, TINYINT 占用 1 个字节。
示例 1:定义的列数据类型为 TINYINT。
示例中用到的表及数据:
create table products(productnum TINYINT);
INSERT INTO products(productnum) VALUES(1);
gbase> SELECT productnum FROM products;
+------------+
| productnum |
+------------+
| 1 |
+------------+
1 row in set
SMALLINT
整数类型。它的范围是-32767 到 32767, SMALLINT 占用 2 个字节。
示例 1:定义的列数据类型为 SMALLINT。
示例中用到的表及数据:
create table products(productnum SMALLINT);
INSERT INTO products(productnum) VALUES(1);
gbase> SELECT productnum FROM products;
+------------+
| productnum |
+------------+
| 1 |
+------------+
1 row in set
INT
整数类型。 INTEGER 的同义词。它的范围是-2147483647 到 2147483647,
INT 占用 4 个字节。
示例 1:定义的列数据类型为 INT。
示例中用到的表及数据:
create table products(productnum INT);
INSERT INTO products(productnum) VALUES(1);
gbase> SELECT productnum FROM products;
+------------+
| productnum |
+------------+
| 1 |
+------------+
1 row in set
BIGINT
整数类型。它的范围是-9223372036854775806 到 9223372036854775806,
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 8a MPP Cluster 允许在关键字 FLOAT 后面的括号内选择用位指定精度,即 FLOAT(X)。 0 到 23 的精度对应 FLOAT 列的 4 字节单精度, 24 到 53的精度对应 DOUBLE 列的 8字节双精度。当 24<=X<=53 时, FLOAT(X)与 DOUBLE(X)等价。
同时 GBase 8a MPP Cluster 允许使用非标准语法 FLOAT(M,D)(M 是整数位数和小数位数的总位数, D 是小数的位数), GBase 8a MPP Cluster 保存值时进行四舍五入。
定义的列数据类型为 FLOAT。
示例中用到的表及数据:
CREATE TABLE products(productnum FLOAT);
INSERT INTO products(productnum) VALUES(-19000.44365),
(-19000.48365),(1.44365),(1.443658);
gbase> SELECT productnum FROM products;
+------------+
| productnum |
+------------+
| -19000.4 |
| -19000.5 |
| 1.44365 |
| 1.44366 |
+------------+
4 rows in set
定义的列数据类型为 FLOAT(M)
定义的列数据类型为 FLOAT(M) , M 小于等于 23 时,小数部分只保留一位有效数字,系统会自动对数字进行四舍五入;
定义的列数据类型为 FLOAT(M), 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
定义的列数据类型为 FLOAT(M,N)
示例 1:定义的列数据类型为 FLOAT(20,5),指定精度为 5,则小数部分保留 5 位数字。
示例中用到的表及数据:
CREATE TABLE products(productnum FLOAT(20,5));
INSERT INTO products(productnum) VALUES(19000.44365),(19000.443652);
gbase> SELECT productnum FROM products;
+-------------+
| productnum |
+-------------+
| 19000.44336 |
| 19000.44336 |
+-------------+
2 rows in set
示例 2:定义的列数据类型为 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.7976931348623157E+308 到-2.2250738585072014E-308、0、 2.2250738585072014E-308 到 1.7976931348623157E+308。这些是理论限制,基于 IEEE 标准。实际的范围根据硬件或操作系统的不同可能稍微小些。
GBase 8a MPP Cluster 允许在关键字 DOUBLE 后面的括号内选择用位指定精度,即DOUBLE (X)。 0 到 23 的精度对应 FLOAT 列的 4 字节单精度, 24到 53 的精度对应 DOUBLE 列的 8 字节双精度。当 24<=X<=53 时, FLOAT(X)与DOUBLE(X)等价。
同时 GBase 8a MPP Cluster 允许使用非标准语法 DOUBLE(M,D)(M 是整数位数和小数位数的总位数, D 是小数的位数), 在超过精度描述的情况下,GBase 8a 保存值时进行四舍五入。
示例 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 是总位数,支持的最大位数为 65;D 是小数点后面的位数,支持的最大位数为 30。
当 M<=18 时, DECIMAL 类型数据占 2 字节,当 M>18 时占用 4 字节,所以在不需要过高的数字精度的场景中, 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数据类型完全等价。