南大通用GBase 8a MPP Cluster支持的数据类型(一)

原文链接:https://www.gbase.cn/community/post/4332
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

今天给大家介绍下GBase 8a MPP Cluster支持的SQL标准,以及支持的数据类型,再给大家详细介绍下数值类型,如需了解其他类型,请关注后续文章。

GBase 8a MPP Cluster支持的SQL 标准:

默认支持SQL-92的主要特性。

接下来给大家介绍下支持的数据类型,再详细介绍下数值类型:

1 数据类型

GBase 8a MPP Cluster支持SQL-92中定义的绝大多数数据类型,同时也支持SQL99和SQL2003中定义的大部分数据类型。GBase 8a MPP Cluster支持的数据类型,如下表所示:

GBase 8a MPP Cluster的数据类型

数值型TINYINT
SMALLINT
INT
BIGINT
FLOAT
DOUBLE
DECIMAL
NUMERIC
字符型CHAR
VARCHAR
TEXT
二进制类型BLOB
LONGBLOB
日期和时间型DATE
DATETIME
TIME
TIMESTAMP

注意:以下数据类型在gcluster层与gnode层范围有差异,gcluster层支持范围较gnode支持范围大,建议应用开发中以较小的支持范围为准,便于应用在gcluster和gnode层的统一处理。本章节数据类型的范围描述统一为gcluster和gnode共同支持的范围,即以较小的gnode范围为准。

数据类型Gcluster层范围Gnode层范围
timestamp

最大值2038-01-19 11:14:07

最小值1970-01-01 08:00:01

最大值2038-01-01 00:59:59

最小值1970-01-01 08:00:01

tinyint

最大值127

最小值-128

最大值127

最小值-127

smallint

最大值32767

最小值-32768

最大值32767

最小值-32767

bigint

最大值9223372036854775807

最小值-9223372036854775806

最大值9223372036854775806

最小值-9223372036854775806

2 数值类型

GBase 8a MPP Cluster支持数据类型包括严格的数值数据类型(TINYINT,SMALLINT,INT,BIGINT,DECIMAL,NUMERIC),以及近似的数值数据类型(FLOAT,DOUBLE)。
为了更有效地使用存储空间,请用户尽量使用最精确的类型。例如,如果一个整数列被用于在1~127之间的值,TINYINT是最好的类型。为了存储更大范围的数值,用户可以选择BIGINT或DECIMAL类型。

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

类型名称最小值最大值占用字节数
TINYINT-1271271
SMALLINT-32767327672
INT(INTEGER)-214748364721474836474
BIGINT-922337203685477580692233720368547758068
FLOAT-3.40E+383.40E+384
DOUBLE-1.7976931348623157E+3081.7976931348623157E+3088
DECIMAL[(M[, D])]-(1E+M -1)/(1E+D)(1E+M -1)/(1E+D)动态计算
NUMERIC[(M[, D])]-(1E+M -1)/(1E+D)(1E+M -1)/(1E+D)动态计算

2.1 TINYINT

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

2.2 SMALLINT

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

2.3 INT

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

2.4 BIGINT

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

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

CREATE TABLE products(productnum BIGINT);
INSERT INTO products(productnum) VALUES(100);
gbase> SELECT productnum FROM products;
+------------+
| productnum |
+------------+
|        100 |
+------------+
1 row in set
gbase> DESC products;
+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| productnum | bigint(20) | YES  |     | NULL    |       |
+------------+------------+------+-----+---------+-------+
1 row in set (Elapsed: 00:00:00.01)

2.5 FLOAT

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

FLOAT标准格式 :float(M)  0<= M <=53; 
FLOAT非标准格式:float(M,D) 其中 0<=M <=255, 0<=D<=30;

GBase 8a MPP Cluster允许在关键字FLOAT后面的括号内选择用位指定精度,即FLOAT(X)。0到24的精度对应FLOAT列的4字节单精度,25到53的精度对应DOUBLE列的8字节双精度。

定义的列数据类型为FLOAT(M),M<=24时,无论整数位数和小数位数多少整体最多只保留6位有效数字;M>24时,无论整数位数和小数位数多少整体最多只保留15位有效数字。
GBase 8a MPP Cluster允许使用非标准语法FLOAT(M,D)(M是整数位数和小数位数的总位数,D是小数的个数)。GBase 8a MPP Cluster保存值时进行四舍五入。最大可以设置为FLOAT(255,30)。

示例

示例1:定义的列数据类型为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

示例2:定义的列数据类型为FLOAT(M),系统会自动对数字进行四舍五入。

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),(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

2.6 DOUBLE

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

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

示例:定义的列数据类型为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

2.7 DECIMAL

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

在DECIMAL[(M[, D])]数据类型中,M是总位数,支持的最大长度为65;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值,那么插入一个非整数值的数字时,将按照四舍五入的原则截取到整数位。

注意:Decimal与时间进行比较,只支持decimal的常量与datetime比较,不支持decimal列与datetime比较。

如:表中g列为decimal类型,f列为datetime类型,则支持select * from t1 where g=cast('20220212112059.010000' as date); 不支持Select * from t1 where g=f;

示例

示例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

2.8 NUMERIC

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

以上就是今天的内容了,感谢大家阅读,谢谢~

原文链接:https://www.gbase.cn/community/post/4332
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值