GBase 8a
其他
文章

GBase8a 数据类型 --- 数值类型

发表于2025-06-29 15:32:5124次浏览3个评论

GBase 8a MPP Cluster 支持 SQL-92 中定义的绝大多数数据类型,同时也支持

SQL99 和 SQL2003 中定义的大部分数据类型。

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

GBase 8a MPP Cluster 的数据类型
数值型TINYINT
SMALLINT
INT
BIGINT
FLOAT
DOUBLE
DECIMAL
NUMERI
字符型CHAR
V ARCHAR
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

数值类型

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)动态计算

TINYINT

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

SMALLINT

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

INT

整数类型。 INTEGER 的同义词。 它的取值范围是-2147483647 到 2147483647, INT

占用 4 个字节。

BIGINT

整数类型。它的取值范围是-9223372036854775806 到 9223372036854775806,

BIGINT 占用 8 个字节。

示例

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

CREATE TABLE products(productnum BIGINT);
INSERT INTO products(productnum) V ALUES(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)

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) V ALUES(-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) V ALUES(-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) V ALUES(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(M,D) (M 是整数位数和小数位数的总位数, D 是小数的个数) , GBase 8a MPP Cluster 保存值时进行四舍五入。

示例

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

CREATE TABLE products(productnum DOUBLE);
INSERT INTO products(productnum) V ALUES(-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[(MS[, 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) V ALUES(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) V ALUES(191220.443);
ERROR 1264 (22003): Out of range value for column 'productnum' at row 1
gbase> INSERT INTO products(productnum) V ALUES(19122.4436);
Query OK, 1 row affected, 1 warning
gbase> SELECT productnum FROM products;
+------------+
| productnum |
+------------+
| 19122.444 |
+------------+
1 row in set

NUMERIC

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

 

 

评论

登录后才可以发表评论
用户头像
levvel发表于 8个月前
评论是对发帖人的一种尊重
崔哥发表于 5个月前
乔木生云气。访中兴、英雄陈迹,暗追前事。战舰东风慳借便,梦断神州故里。旋小筑、吴宫闲地。华表月明归夜鹤,叹当时、花竹今如此。枝上露,溅清泪。遨头小簇行春队。步苍苔、寻幽别坞,问梅开未。重唱梅边新度曲,催发寒梢冻蕊。此心与、东君同意。后不如今今非昔,两无言、相对沧浪水。怀此恨,寄残醉。
用户头像
柒柒天晴发表于 2个月前
学会了