暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBase 8s数据类型之数值类型

原创 Todd 2022-01-19
1440

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

为了更有效地使用存储空间,请用户尽量使用最精确的类型。

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

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

GBase 8s 分布式支持的数值类型,如下表所示:

类型名称

最小值

最大值

占用字节数

TINYINT

-32767

32767

2

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)

动态计算


同SMALLINT。

2、SMALLINT

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

3、INT

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

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

 

5、FLOAT

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

GBase 8s允许在关键字FLOAT后面的括号内选择用位指定精度,即FLOAT(X)。0到24的精度等同于FLOAT类型,支持最大6位有效数字,Gbase 8s保留值时进行五舍六入;25到53的精度等同于DOUBLE类型,支持最大15位有效数字,GBase 8s保存值时进行四舍五入。具体精度参数没有实际差别,仅供语法支持。

同时GBase 8s允许使用非标准语法FLOAT(M,D),完全等同于FLOAT类型精度,支持最大6位有效数字,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),精度参数小于等于24时,最多保留6位有效数字。系统会自动对数字进行五舍六入。

定义的列数据类型为FLOAT(M),精度参数大于24时,最多保留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),等同于FLOAT类型,保留6位有效数字,自动五舍六入。

示例中用到的表及数据:

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

| 19000.4     |

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

2 rows in set

 

6、DOUBLE

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

GBase 8s允许使用非标准语法DOUBLE(M,D),完全等同于DOUBLE类型精度。支持最大15位有效数字。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

 

7、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

8、NUMERIC

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论