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