GBase8s数据类型之数值类型
GBase 8s 分布式⽀持数据类型包括严格的数值数据类型(TINYINT,SMALLINT,INT,BIGINT,DECIMAL),以及近似的数值数据类型(FLOAT,DOUBLE)。
为了更有效地使⽤存储空间,请⽤户尽量使⽤最精确的类型。
为了存储更⼤范围的数值,⽤户可以选择BIGINT或DECIMAL类型。
作为SQL92标准的扩展,GBase 8s 分布式也⽀持整数类型TINYINT,SMALLINT和BIGINT。
GBase 8s 分布式⽀持的数值类型,如下表所⽰:
类型名称最⼩值最⼤值占⽤字节数
TINYINT-32767327672
SMALLINT-32767327672
INT(INTEGER)-214748364721474836474
BIGINT-922337203685477580792233720368547758078
FLOAT-3.40E+38 3.40E+384
DOUBLE-1.797693134862315E+308 1.797693134862315E+3088
DECIMAL[(M[,D])]-(1E+M-1)/(1E+D)(1E+M -1)/(1E+D)动态计算
1、TINYINT
同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 |
+-------------+decimal是整数数据类型
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数据类型完全等价。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论