数值类型

数字操作符和相关的内置函数请参见数字操作函数和操作符

相比于原始的openGauss,dolphin对于数值类型的修改主要为:

  1. 新增INT/TINYINT/SMALLINT/BIGINT支持可选的修饰符(n),即支持TINYINT(n)/SMALLINT(n)/BIGINT(n)的用法,n的作用仅在tinyint(1)和tinyint(1) unsigned类型时JDBC的getObject接口会将数据自动转换成boolean类型返回,除此之外的其他场景无实际意义,不影响任何表现。
  2. 新增MEDIUMINT(n)数据类型,是INT4的别名,n无实际作用,不影响任何表现。存储空间为4字节,数据范围为-2,147,483,648 ~ +2,147,483,647
  3. 新增FIXED[(p[,s])]数据类型,是NUMERIC类型的别名。用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。
  4. 新增float4(p[,s])的方式,等价于dec(p[,s])
  5. 新增double数据类型,是float8的别名。
  6. 新增float4/float支持可选的修饰符(n),即支持float4(n)/float(n)的用法,当n在 [1,24]之间时,float4(n)/float(n)代表单精度浮点数;当n在 [25,53]之间时,float4(n)/float(n)代表双精度浮点数。
  7. 对于decimal/dec/fixed/numeric数据类型,在未指定精度的情况下,默认精度为(10,0),即总位数为10,小数位数为0。
  8. 新增UNSIGNED INT/TINYINT/SMALLINT/BIGINT类型,与普通整型相比,其最高位是数字位而非符号位;此外,在openGauss中,TINYINT默认为无符号类型,而在B库中则默认是有符号的。
  9. 新增zerofill属性修饰,只是语法上的支持,实际并没有填充零的效果。与UNSIGNED的作用等价。zerofill仅支持作用于整型类型(int、tinyint、smallint、mediumint、bigint)。
  10. 新增cast函数类型转换参数signed/unsigned,其中cast as unsigned将类型转换为uint8,cast as signed将类型转换为int8.
  11. 新增float(p,s),double(p,s),real(p,s),double precision(p,s)的语法,其中float(p,s),real(p,s),double precision(p,s)大致等价于dec(p,s),与dec(p,s)不同的是,float(p,s),real(p,s),double precision(p,s)的p和s必须为整数,而double(p,s)则完全等价于dec(p,s)。舍入方式为四舍五入。

表 1 整数类型

名称

描述

存储空间

范围

TINYINT(n)

微整数,别名为INT1。n的主要作用是n为1的时候JDBC的getObject接口会将数据自动转换成boolean类型返回,除此之外无其他的实际作用,取整范围为1-255。

1字节

-128 ~ +127

SMALLINT(n)

小范围整数,别名为INT2。n无实际作用,不影响任何表现,取值范围为1-255。

2字节

-32,768 ~ +32,767

INTEGER(n)

常用的整数,别名为INT4。n无实际作用,不影响任何表现,取值范围为1-255。

4字节

-2,147,483,648 ~ +2,147,483,647

MEDIUMINT(n)

INT4的别名,n无实际作用,不影响任何表现,取值范围为1-255。

4字节

-2,147,483,648 ~ +2,147,483,647

BIGINT(n)

大范围的整数,别名为INT8。n无实际作用,不影响任何表现,取值范围为1-255。

8字节

-9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807

TINYINT(n) UNSIGNED

无符号微整数,别名为UINT1。n的主要作用是n为1的时候JDBC的getObject接口会将数据自动转换成boolean类型返回,除此之外无其他的实际作用,取整范围为1-255。

1字节

0 ~ 255

SMALLINT(n) UNSIGNED

无符号小范围整数,别名为UINT2。n无实际作用,不影响任何表现,取值范围为1-255。

2字节

0 ~ +65,535

INTEGER(n) UNSIGNED

无符号整数,别名为UINT4。n无实际作用,不影响任何表现,取值范围为1-255。

4字节

0 ~ +4,294,967,295

MEDIUMINT(n) UNSIGNED

UINT4的别名,n无实际作用,不影响任何表现,取值范围为1-255。

4字节

0 ~ +4,294,967,295

BIGINT(n) UNSIGNED

大范围的无符号整数,别名为UINT8。n无实际作用,不影响任何表现,取值范围为1-255。

8字节

0 ~ +18,446,744,073,709,551,615

示例:

--创建具有TINYINT(n), SMALLINT(n), MEDIUMINT(n), BIGINT(n)类型数据的表。
openGauss=# CREATE TABLE int_type_t1
           (
            IT_COL1 TINYINT(10),
            IT_COL2 SMALLINT(20),
            IT_COL3 MEDIUMINT(30),
            IT_COL4 BIGINT(40),
            IT_COL5 INTEGER(50)
           );

--查看表结构。
openGauss=# \d int_type_t1
     Table "public.int_type_t1"
 Column  |     Type     | Modifiers
---------+--------------+-----------
 IT_COL1 | tinyint(10)  |
 IT_COL2 | smallint(20) |
 IT_COL3 | integer(30)  |
 IT_COL4 | bigint(40)   |
 IT_COL5 | integer(50)  |

--创建带zerofill属性字段的表。
openGauss=# CREATE TABLE int_type_t2
           (
            IT_COL1 TINYINT(10) zerofill,
            IT_COL2 SMALLINT(20) unsigned zerofill,
            IT_COL3 MEDIUMINT(30) unsigned,
            IT_COL4 BIGINT(40) zerofill,
            IT_COL5 INTEGER(50) zerofill
           );

--查看表结构。
openGauss=# \d int_type_t2
   Table "public.int_type_t2"
 Column  |   Type    | Modifiers
---------+-----------+-----------
 IT_COL1 | uint1(10) |
 IT_COL2 | uint2(20) |
 IT_COL3 | uint4(30) |
 IT_COL4 | uint8(40) |
 IT_COL5 | uint4(50) |

--删除表。
openGauss=# DROP TABLE int_type_t1, int_type_t2;

--利用cast unsigned将表达式转换为uint8类型
openGauss=# select cast(1 - 2 as unsigned);
        uint8
----------------------
 18446744073709551615
(1 row)

--利用cast signed将表达式转换为int8类型
openGauss=# select cast(1 - 2 as signed);
 int8
------
   -1
(1 row)

表 2 任意精度型

名称

描述

存储空间

范围

NUMERIC[(p[,s])],

DECIMAL[(p[,s])]

FIXED[(p[,s])]

精度p取值范围为[1,1000],标度s取值范围为[0,p]。

说明:

p为总位数,s为小数位数。

用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。

显式使用且未指定精度的情况下,等价于(10,0),即小数点前最大10位,小数点后0位。隐式转换且未指定精度的情况下(例如函数隐式转换或者create table as等场景),等价于NUMBER,即无精度限制。

NUMBER[(p[,s])]

NUMERIC类型的别名。

用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。

未指定精度的情况下,小数点前最大131,072位,小数点后最大16,383位。

示例:

--创建具有FIXED(p,s), FIXED, decimal, number类型数据的表。
openGauss=# CREATE TABLE dec_type_t1
           (
            DEC_COL1 FIXED,
            DEC_COL2 FIXED(20,5),
            DEC_COL3 DECIMAL,
            DEC_COL4 NUMBER
           );

--查看表结构。
openGauss=# \d dec_type_t1
      Table "public.dec_type_t1"
  Column  |     Type      | Modifiers
----------+---------------+-----------
 dec_col1 | numeric(10,0) |
 dec_col2 | numeric(20,5) |
 dec_col3 | numeric(10,0) |
 dec_col4 | numeric       |

--删除表。
openGauss=# DROP TABLE dec_type_t1;

表 3 浮点类型

名称

描述

存储空间

范围

FLOAT[(p)],

FLOAT4[(p)]

浮点数,不精准。精度p取值范围为[1,53]。

4字节或8字节

当精度p在 [1,24]之间时,选项REAL作为内部表示,当精度p在 [25,53]之间时,选项DOUBLE PRECISION作为内部表示。如不指定精度,内部用REAL表示。

DOUBLE PRECISION,

FLOAT8,

DOUBLE

双精度浮点数,不精准。

8字节

-1.79E+308~1.79E+308,15位十进制数字精度。

FLOAT4(p,s)

精度p取值范围为[1,1000],标度s取值范围为[0,p]。

说明:

p为总位数,s为小数位位数。等价于dec(p,s)

用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。

FLOAT(p,s),

DOUBLE(p,s),

REAL(p,s),

DOUBLE PRECISION(p,s)

精度p取值范围为[1,1000],标度s取值范围为[0,p]。

说明:

p为总位数,s为小数位位数,其中float(p,s),real(p,s),double precision(p,s)大致等价于dec(p,s),但p和s都必须为整数,而double(p,s)完全等价于dec(p,s)。舍入方式为四舍五入。

用户声明精度。每四位(十进制位)占用两个字节,然后在整个数据上加上八个字节的额外开销。

示例:

--创建具有float4(p,s), double, float4(n), float(n)类型数据的表。
openGauss=# CREATE TABLE float_type_t1
           (
            F_COL1 FLOAT4(10,4),
            F_COL2 DOUBLE,
            F_COL3 float4(10),
            F_COL4 float4(30),
            F_COL5 float(10),
            F_COL6 float(30)
           );

--查看表结构。
openGauss=# \d float_type_t1
     Table "public.float_type_t1"
 Column |       Type       | Modifiers
--------+------------------+-----------
 f_col1 | numeric(10,4)    |
 f_col2 | double precision |
 f_col3 | real             |
 f_col4 | double precision |
 f_col5 | real             |
 f_col6 | double precision |

--删除表。
openGauss=# DROP TABLE float_type_t1;

--创建具有float(p,s), double(p,s), real(p,s), double precision(p,s)类型数据的表。
openGauss=# CREATE TABLE test_float_double_real_double_precision
           (
            a FLOAT(20,2),
            b DOUBLE(20,2),
            c REAL(20,2),
            d DOUBLE PRECISION(20,2)
           );

--查看表结构。
openGauss=# \d test_float_double_real_double_precision        
    Table "public.test_float_double_real_double_precision"
 Column |     Type      | Modifiers 
--------+---------------+-----------
 a      | numeric(20,2) | 
 b      | numeric(20,2) | 
 c      | numeric(20,2) | 
 d      | numeric(20,2) |

--删除表
openGauss=# DROP TABLE test_float_double_real_double_precision;
意见反馈
编组 3备份
    openGauss 2024-12-23 00:51:56
    取消