版本:7.0.0

Numeric Types ​

表 1 整数类型

名称描述存储空间范围
BINARY_INTEGER存储32位有符号整数4字节-2^31 ~ 2^31 - 1
BINARY_UINT32存储32位无符号整数4字节0 ~ 2^32 - 1
BINARY_BIGINT存储64位有符号整数8字节-2^63 ~ 2^63 - 1

示例:

-- 创建具有BINARY_INTEGER、BINARY_UINT32、BINARY_BIGINT类型数据的表。
SQL> CREATE TABLE int_type_t2 
(
    a BINARY_INTEGER, 
    b BINARY_UINT32,
    c BINARY_BIGINT
);

-- 插入数据。
SQL> INSERT INTO int_type_t2 VALUES(100, 10, 1000);

-- 查看数据。
SQL> SELECT * FROM int_type_t2;

A            B                                        C
------------ ---------------------------------------- --------------------
100          10                                       1000

1 rows fetched.

-- 删除表。
SQL> DROP TABLE int_type_t2;

表 2 浮点类型

名称描述存储空间范围
BINARY_DOUBLE存储64位双精度浮点数8字节[-1.79E+308, +1.79E+308]

说明:

  • 该数据类型是不精确的,意味着一些数值不能精确地转换成内部格式并且是以近似值存储的,因此存储后再把数据打印出来可能有一些差异。如果想用不精确的类型做任何重要的复杂计算,尤其是那些对范围情况(无穷/下溢)严重依赖的事情,应该仔细评估SQL和应用实现,直接拿两个浮点数值进行比较,不一定总是能得到预期的结果。
  • 支持f/d结尾的数字写法,不区分大小写,均表示八字节浮点数,取值范围同BINARY_DOUBLE;普通SQL语句接收以f/d结尾的浮点数由GUC参数use_bison_parser控制,该参数默认值为false。如需使用该语法,需将use_bison_parser设置为true。

示例:

-- 创建浮点类型数据的表。
SQL> CREATE TABLE float_type_t2 
(
    a BINARY_DOUBLE
);

-- 插入数据。
SQL> INSERT INTO float_type_t2 VALUES(1234567.89);

SQL> alter system set use_bison_parser = false;

SQL> INSERT INTO float_type_t2 VALUES(1234567.89F);

OG-00636, [1:34]Invalid number 

SQL> alter system set use_bison_parser = true;

SQL> INSERT INTO float_type_t2 VALUES(1234567.89F);
SQL> INSERT INTO float_type_t2 VALUES(1234567.89f);
SQL> INSERT INTO float_type_t2 VALUES(1234567.89D);
SQL> INSERT INTO float_type_t2 VALUES(1234567.89d);

-- 查看数据。
SQL> SELECT * FROM float_type_t2;

A
--------------------
1234567.89
1234567.89
1234567.89
1234567.89
1234567.89

5 rows fetched.

-- 删除表。
SQL> DROP TABLE float_type_t2;

表 3 高精度数值类型

名称描述存储空间范围
NUMBER/DECIMAL/NUMERIC[(p[,s])]存储高精度浮点数
1. p取值范围[1,38],表示能存储的最大精度
2. s取值范围[-84,127],表示小数点后面有效数字个数,若为负数,则将小数点左边对应个数的数字约掉
3. 若不指定p和s,表示不对小数点后面的数值做限制,最大能存储40位有效数字
4. 若制定了p且未指定s或指定s=0,表示number类型没有小数部分
4~24字节(-1.0E128, 1.0E128)

示例:

-- 创建不同精度、小数位类型数据的表。
SQL> CREATE TABLE number_type_t2 
(
    a NUMBER, 
    b NUMBER(12),
    c NUMBER(12, 3),
    d NUMBER(12, -2)
);

-- 插入数据。
SQL> INSERT INTO number_type_t2 VALUES(1234567.89, 1234567.89, 1234567.89, 1234567.89);

-- 查看数据。
SQL> SELECT * FROM number_type_t2;

A                                        B                                        C                                        D                                  
---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------------------------
1234567.89                               1234568                                  1234567.89                               1234600                            

1 rows fetched.

-- 设置参数。
SQL> alter system set use_bison_parser = true;

-- 插入数据。
SQL> INSERT INTO number_type_t2 VALUES(1234567.89f, 1234567.89F, 1234567.89d, 1234567.89D);

-- 查看数据。
SQL> SELECT * FROM number_type_t2;

A                                        B                                        C                                        D                                       
---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------------------------
1234567.89                               1234568                                  1234567.89                               1234600                                 
1234567.89                               1234568                                  1234567.89                               1234600                                 

2 rows fetched.

-- 删除表。
SQL> DROP TABLE number_type_t2;

说明:

  • 表4列出了在USE_NATIVE_DATATYPE参数控制下,数据类型关键字实际映射的数据类型。该参数为布尔类型,用于解决不同数据库间的兼容性,区分数值类型的关键字,默认值为TRUE。

  • 部分关键字不受USE_NATIVE_DATATYPE参数影响,包括:BINARY_INTEGER、BINARY_BIGINT、BINARY_DOUBLE。

表 4 数据类型关键字映射表

关键字USE_NATIVE_DATATYPE=FALSE时映射的数据类型USE_NATIVE_DATATYPE=TRUE时映射的数据类型
BIGINTNUMBER(38)BINARY_BIGINT
DOUBLENUMBERBINARY_DOUBLE
FLOATNUMBERBINARY_DOUBLE
INT/INTEGERNUMBER(38)BINARY_INTEGER
UINT/INTEGER UNSIGNEDNUMBER(38)BINARY_UINT32
REALNUMBERBINARY_DOUBLE
SMALLINTNUMBER(38)BINARY_INTEGER
TINYINTNUMBER(38)BINARY_INTEGER