4.1 数值类型
数值类型包括整数类型、任意精度数字类型、浮点类型、序列类型、货币类型等。
4.1.1 整数类型
smallint、integer、bigint都是整数类型,每种类型只能存储一定范围内的整数,超过该范围将报错。每种类型的范围如表4-1所示。
表4-1 整数类型
常用的整数类型是integer,因为它提供了在范围、存储空间和性能之间的最佳平衡。一般只有在硬盘容量不足时才使用smallint类型。而只有在integer类型的范围不够时才使用bigint类型。
【举例】整数类型的基本操作,代码如下:
4.1.2 任意精度数字类型
任意精度数字类型包括numeric和decimal。两者在使用上是等价的,每种类型的范围如表4-2所示。
表4-2 任意精度数字类型
numeric类型通过numeric(precision,scale)来定义。
● precision称为精度,表示总共的位数。
● scale称为比例,表示小数部分的位数。
如果用户插入的数字小数位数超过scale,则系统自动进行四舍五入。如果用户插入的数字超出最大范围,则插入失败。
【举例】任意精度数字类型的基本操作,代码如下:
4.1.3 浮点类型
PostgreSQL中的浮点类型用来存储小数,浮点类型包括real和double precision,每种类型的范围如表4-3所示。
表4-3 浮点类型
在大部分平台上,real类型的范围是-1E+37~1E+37,精度至少是6位数字。double precision类型的范围是-1E+308~1E+308,精度至少是15位数字。太大或太小的值都会导致错误。
PostgreSQL还支持SQL标准表示法float和float(p),用于声明非精确的数字类型。在这里,p指定以二进制位表示的最低可接受精度。
real和double precision都是不准确的、可变精度的数字类型。这意味着:一些值不能准确地转换成内部格式,而是以近似的形式存储的。因此,存储和检索一个值可能出现一些缺失。如果要进行准确的存储和计算(计算货币金额),则应该使用numeric类型。
【举例】浮点类型的基本操作,代码如下:
提示:
在PostgresSQL中,浮点类型有3个特殊值,即Infinity、-Infinity和NaN,分别表示正无穷、负无穷大、非数字。
4.1.4 序列类型
smallserial、serial和bigserial不是真正的数据类型,它们作为唯一标识符列而存在,其范围如表4-4所示。用户在需要使用自增整数时,可以选用这三者之一。如果一个表中本身的字段中没有适宜作为主键的,则可以增加一个专门的字段并指定serial类型为主键。
表4-4 序列类型
【举例】序列类型的基本操作,代码如下:
4.1.5 货币类型
money类型用于存储固定小数精度的货币数字,其范围如表4-5所示。其小数的精度由数据库系统的lc_monetary参数设置决定。lc_monetary参数用来指定货币符号对应的地区,与时区概念类似。
表4-5 货币类型
money类型可以接受很多输入格式,包括整数和浮点数,以及常用的货币格式,如“$1,000.00”。输出通常是货币格式,不同区域的货币符号有所不同。
lc_monetary参数的默认设置是“en_US.utf8”,其货币格式为美元。如果要输出为人民币格式,则需要将lc_monetary参数设置为“zh_CN.utf8”,代码如下:
4.1.6 实例21:使用数学运算符
PostgreSQL为很多类型提供了数学运算符,如表4-6所示。
表4-6 数学运算符
按位运算符只能用于整数类型,而其他的运算符可以用于全部的数据类型。按位运算符还可以用于位串类型bit和bit varying。
数值类型还支持表4-7中的比较运算符。比较运算符也可以用于除数值外的其他类型,如字符串类型。所有比较运算符都是双目运算符,它们返回boolean类型。
表4-7 比较运算符