数值类型¶
神通数据库提供的数值类型如下表所示:
表24神通数据库提供的数值类型
| 数值类型 | 存储空间 | 描述 | 范围 |
|---|---|---|---|
| TINYINT, INT1 | 1 字节 | 固定精度 | -128到127 |
| SMALLINT, INT2 | 2 字节 | 固定精度 | -2^15到 2^15-1 |
| INT, INTEGER, INT4 | 4字节 | 固定精度 | -2^31到2^31-1 |
| BIGINT, INT8 | 8 字节 | 极大范围的固定精度数字 | -2^63(-9223372036854775808)到2^63-1(9223372036854775807) |
| DECIMAL(p,s) 0<p<=1000, 0<=s<=p | 变长 | 固定精度(p)和小数位(s)的数字数据 p默认为18,s默认为0。兼容ORACLE模 式下,p默认为126,s默认为0。 | 最大精度p为1000,s则可在0-p之间变化,s<=p |
| NUMERIC(p,s) 0<p<=1000, (-p)<=s<=p | 变长 | 固定精度(p)和小数位(s)的数字数据 p默认为18,s默认为0。兼容ORACLE模 式下,p默认为126,s默认为0。 | 最大精度p为1000,s则可在(-p)-p之间变化,|s|<=p |
| REAL, float4 | 4 字节 | 变精度,不精确 | [1.175494351e-38, 3.402823466e+38] 小于 1.175494351e-38 调整为 0 |
| DOUBLE PRECISION, FLOAT8 | 8 字节 | 浮点精度数字 | [2.2250738585072014e-308, 1.7976931348623158e+308] 小于 2.2250738585072014e-308 调整为 0 |
| FLOAT(n) 1<=n<=24 | 4字节 | 指定低精度浮点精度 | [1.175494351e-38, 3.402823466e+38] 小于 1.175494351e-38 调整为 0 |
| FLOAT(n) 24<n<=53 | 8字节 | 指定高精度浮点数(n默认值为53) | [2.2250738585072014e-308, 1.7976931348623158e+308] 小于 2.2250738585072014e-308 调整为 0 |
| SERIAL | 4 字节 | 自增整数 | 1 到 +2147483647 |
| BIGSERIAL | 8 字节 | 自增整数 | 1 到 +9223372036854775807 |
神通数据库中各数值类型说明如下:
整数类型:
神通数据库中整数类型包括tinyint,smallint,integer,bigint,它们是不含小数部分的数字。常用的整数类型是integer,它提供了在范围,存储空间和性能之间的最佳平衡,一般只有在磁盘空间紧张的时候才使用smallint,而在integer的范围不够时才使用 bigint。 bigint 类型依赖编译器对八字节整数的支持,因此有可能在不同机器上表现不同。如果编译器不支持八字节整数,bigint 的作用和 integer一样(但是仍占据八字节存储)。 SQL92标准只定义了整数类型integer(或int)和smallint,类型bigint、int2、int4、和int8 都是神通数据库的扩展。
任意精度类型:
神通数据库中任意精确度类型为numeric和decimal以及number,它们可以存储最多1,000位精度的数字并且能准确地进行计算,它用于货币金额和其它要求准确计算的对象。但numeric和number 类型的运算速度要比下面介绍的的浮点类型慢。numeric、number和decimal类型数据都有比例(scale)和精确度(precision),比例指到小数点后面的小数部分的位数,精度指整个值中全部数据位的数目,如数字 23.5141的精度为6而比例为4。精度必须为正整数,比例可以为零或者正整数,但要介于0和精度之间。整数的比例认为零。
用户可以定义numeric、number或decimal 类型的精度和比例,如:
number(p, s)、numeric(p, s)或decimal(p,s)声明精确度为p,比例为s的number、numeric或decimal常量,而 number(p, s)、numeric(p)或decimal(p)声明精确度为p,比例为0的number、numeric或decimal常量。不指定精度或比例时,按精确度为18,比例为0处理。
浮点类型:
神通数据库中浮点类型包括double precision,real和float,real等效于float4, double precision等效于float8,当float不指明精度时,默认精度n为53。浮点类型表示近似的、不准确的、变精度的数字。不准确意味着一些数值不能准确地转换成数据库内部格式,只能以近似的形式来存储,因此当数据输出时可能有缺失现象。
除了普通的数字值之外,浮点类型还有几个特殊值: Infinity、-Infinity、NaN
这些值分别表示 IEEE 754 特殊值"正无穷大"、"负无穷大"、"不是一个数字"。在不遵循 IEEE 754 浮点算术的机器上,这些值的含义可能不是预期的。如果在 SQL 命令里把这些数值当作常量写,引用时需加上单引号,例如:UPDATE table SET x = 'Infinity' 。 输入时大小写无关。
序列类型:
严格讲,序列类型serial不是真正的数据类型,只是神通数据库为便于表中设置唯一标识而提供的一种便利。
示例1:
CREATE TABLE tab1(a SERIAL);
-- 等价于
CREATE SEQUENCE tab1_a_seq;
CREATE TABLE tab1(a INTEGER DEFAULT NEXTVAL('tab1_a_seq') NOT NULL);
声明 SERIAL 会自动创建一个用于构造默认值的序列(序列的 CACHE SIZE 属性由数据库参数 SERIAL_CACHE_SIZE 决定), 并隐式的应用 NOT NULL 约束。 如果需要应用 UNIQUE 或者 PRIMARY KEY 约束则需要显示的进行指定。
类型名 SERIAL 和 SERIAL4 等效,它们都生成 INTEGER 类型字段。 类型 BIGSERIAL 和SERIAL8 等效,它们生成 BIGINT 类型字段。 如果在表的生存期中需要使用的标识数目可能超过2的31次方,那么应该使用 BIGSERIAL。
在删除包含序列类型的表的时候, SERIAL 类型依赖的序列会被自动删除。
对应数值类型,神通数据库中的数值常量也可分为精确数值常量和近似数值常量两种,它们的表示形式说明如下:
- 精确数值常量
精确数值常量用带符号(+或-)或不带符号的数据序列表示,它包括一个整数部分和一个以小数点分隔的小数部分。如果没有小数部分,小数点可以省略,但如果精确数值常量只有小数部分时,开头必须有小数点。
- 近似数值常量
近似数值常量以科学计数法表示,即尾数(x)后紧跟符号E(或e),随后加一个指数(y)来表示。尾数(x)是一个精确数值常数;指数(y)在符号E(或e)后,是一个可以带符号的整数。一个近似数值常数的值等于10的指数(y)次幂与尾数(x)的乘积,即:xEy表示x乘以10的y次方。上面例子中的最后两个就是近似数值常量。
神通数据库中数值类型常量一般为如下形式:
digits
digits.[digits][e[+-]digits]
[digits].digits[e[+-]digits]
digitse[+-]digits
数值类型使用举例:由于其它数值类型用法较简单,这里只举例说明序列类型的用法。
示例1: 使用数值类型
-- 清理环境
DROP TABLE tab1 CASCADE;
CREATE TABLE tab1(a SERIAL, b INT);
-- 插入数值类型
INSERT INTO tab1(b) VALUES(100);
INSERT INTO tab1(b) VALUES(200);
INSERT INTO tab1(b) VALUES(800);
-- 查询数值类型列
-- a 列值自动递增
SELECT * FROM tab1 ORDER BY a;
A(int) |B(int) |
------------------------
1 |100 |
------------------------
2 |200 |
------------------------
3 |800 |
总数目:3
-- 删除表
DROP TABLE tab1;