在本章中,我们将讨论PostgreSQL中使用的数据类型.创建表时,对于每一列,您指定一种数据类型,即您希望在表字段中存储哪种数据.
这可以带来几个好处 :
一致性 : 针对相同数据类型的列的操作提供一致的结果,通常是最快的.
验证 : 正确使用数据类型意味着数据格式验证和数据类型范围之外的数据拒绝.
紧凑性 : 由于列可以存储单一类型的值,因此它以紧凑的方式存储.
性能 : 正确使用数据类型可以最有效地存储数据.存储的值可以快速处理,从而提高性能.
PostgreSQL支持多种数据类型.此外,用户可以使用 CREATE TYPE SQL命令创建自己的自定义数据类型. PostgreSQL中有不同类别的数据类型.它们将在下面讨论.
数字类型由两个字节,四个字节和八个字节的整数组成,四个字节和8字节浮点数,以及可选精度小数.下表列出了可用的类型.
名称 | 存储大小 | 描述 | 范围 |
---|---|---|---|
smallint | 2个字节 | 小范围整数 | - 32768到+32767 |
integer | 4个字节 | 整数的典型选择 | -2147483648至+2147483647 |
bigint | 8个字节 | 大范围整数 | - 9223372036854775808至9223372036854775807 |
decimal | variable | 用户指定的精度,精确 | 小数点前最多131072位;小数点后最多16383位数 |
numeric | 变量 | 用户指定的精度,完全 | 小数点前最多131072位;小数点后最多16383位数 |
real | 4个字节 | 变量精度,不精确 | 6位小数精度 |
double precision | 8 bytes | 变精度,不精确 | 15位小数精度 |
smallserial | 2个字节 | 小自动递增整数 | 1到32767 |
serial | 4 bytes | 自动递增整数 | 1到2147483647 |
bigserial | 8个字节 | 大型自动递增整数 | 1到9223372036854775807 |
money 类型存储货币金额固定分数精度. numeric,int和bigint 数据类型的值可以转换为 money .由于可能出现舍入错误,建议不要使用浮点数来处理货币.
名称 | 存储大小 | 描述 | 范围 |
---|---|---|---|
money | 8字节 | 货币金额 | -92233720368547758.08至+92233720368547758.07 |
下表给出了PostgreSQL中可用的通用字符类型.
S.不. | 姓名&描述 |
---|---|
1 | 字符变化(n),varchar(n) 变量长度有限制 |
2 | 字符(n),字符(n) 固定长度,空白填充 |
3 | text 变量无限长度 |
bytea 数据类型允许存储二进制字符串,如下表所示.
名称 | 存储大小 | 描述 |
---|---|---|
bytea | 1或4个字节加上实际的二进制字符串 | 可变长度的二进制字符串 |
PostgreSQL支持一整套SQL日期和时间类型,如下表所示.日期根据公历计算.此处,所有类型的分辨率 1微秒/14位除日期类型,其分辨率为天.
名称 | 存储大小 | 描述 | 低值 | 高值 |
---|---|---|---|---|
timestamp [(p)] [without time zone ] | 8个字节 | 日期和时间(无时区) | 4713 BC | 294276 AD |
timestamp [(p) ] with time zone | 8 bytes | 日期和时间,时区 | 4713 BC | 294276 AD |
date | 4个字节 | 日期(没有时间) | 4713 BC | 5874897 AD |
time [ (p)] [ without time zone ] | 8个字节 | 时间(无日期) | 00:00:00 | 24:00:00 |
time [ (p)] with time zone | 12个字节 | 仅限一天的时间,带时区 | 00:00:00 + 1459 | 24:00:00-1459 |
interval [fields] [(p)] | 12个字节 | 时间interval | - 178000000年 | 178000000年 |
PostgreSQL提供标准的SQL类型布尔值.布尔数据类型可以具有状态 true , false ,以及第三个状态 unknown ,它由SQL null值表示.
名称 | 存储大小 | 描述 |
---|---|---|
boolean | 1 byte | 状态为true或false |
枚举(枚举)类型是包含静态有序值集的数据类型.它们等同于许多编程语言支持的枚举类型.
与其他类型不同,需要使用CREATE TYPE命令创建枚举类型.此类型用于存储静态的有序值集.例如指南针方向,即NORTH,SOUTH,EAST和WEST或星期几,如下所示 :
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
枚举一旦创建,就可以像任何其他类型一样使用.
几何数据类型表示二维空间对象.最基本的类型,即点,形成所有其他类型的基础.
名称 | 存储大小 | 表示 | 描述 |
---|---|---|---|
point | 16字节 | 飞机上的点 | (x,y) |
line | 32个字节 | 无限行(未完全实现) | ((x1,y1),(x2,y2)) |
lseg | 32字节 | 有限线段 | ((x1,y1),(x2,y2)) |
box | 32 bytes | 矩形框 | ((x1,y1),(x2,y2)) |
path | 16 + 16n bytes | 封闭路径(类似于多边形) | ((x1,y1),...) |
path | 16 + 16n bytes | 打开路径 | [(x1,y1),...] |
polygon | 40 + 16n | 多边形(类似于封闭路径) | ((x1,y1),...) |
circle | 24字节 | Circle | <(x,y),r> (中心点和半径) |
PostgreSQL提供数据用于存储IPv4,IPv6和MAC地址的类型.最好使用这些类型而不是纯文本类型来存储网络地址,因为这些类型提供输入错误检查和专门的操作符和函数.
名称 | 存储大小 | 描述 |
---|---|---|
cidr | 7或19字节 | IPv4和IPv6网络 |
inet | 7或19字节 | IPv4和IPv6主机和网络 |
macaddr | 6个字节 | MAC地址 |
位使用字符串类型存储位掩码.它们是0或1.有两种SQL位类型:位(n)和位变化(n),其中n是正整数.
此类型支持全文搜索,这是搜索自然语言文档集合以查找与查询最匹配的文本的活动.这个有两种数据类型;
S.不. | 姓名&描述 |
---|---|
1 | tsvector 这是已对其进行规范化以合并同一单词的不同变体的不同单词的排序列表,称为"lexemes". |
2 | tsquery 这会存储要搜索的词位,并将它们组合在一起以表达布尔值运营商& (AND),| (或),和! (不).括号可用于强制对运算符进行分组. |
UUID(通用唯一标识符)被写为一系列小写十六进制数字,由连字符分隔的多个组,特别是一组八位数字,后跟三组四位数字,后跟一组12位数,总共32位,代表128位.
UUID的一个例子是 : 550e8400-e29b-41d4-a716-446655440000
XML数据类型可用于存储XML数据.对于存储XML数据,首先必须使用函数xmlparse创建XML值,如下所示 :
XMLPARSE (DOCUMENT '<?xml version="1.0"?> <tutorial> <title>PostgreSQL Tutorial </title> <topics>...</topics> </tutorial>') XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')
json 数据类型可用于存储JSON(JavaScript Object Notation)数据.此类数据也可以存储为 text ,但 json 数据类型的优点是检查每个存储的值是否为有效的JSON值.还有相关的支持函数,可以直接用于处理JSON数据类型,如下所示.
示例 | 示例结果 |
---|---|
array_to_json('{{1,5},{99,100}}':: int []) | [[1,5],[99,100]] |
row_to_json(row(1,' foo')) | {"f1":1,"f2":"foo"} |
PostgreSQL提供了将表的列定义为可变长度多维数组的机会.可以创建任何内置或用户定义的基类型,枚举类型或复合类型的数组.
数组类型可以声明为
CREATE TABLE monthly_savings ( name text, saving_per_quarter integer[], scheme text[][] );
或使用关键字"ARRAY"作为
CREATE TABLE monthly_savings ( name text, saving_per_quarter integer ARRAY[4], scheme text[][] );
可以将数组值插入为文字常量,将元素值括在花括号内并分离他们用逗号.示例如下所示 :
INSERT INTO monthly_savings VALUES (‘Manisha’, ‘{20000, 14600, 23500, 13250}’, ‘{{"FD", "MF"}, {"FD", "Property"}}’);
访问数组的示例如下所示.下面给出的命令将选择第二季度比第四季度节省更多的人.
SELECT name FROM monhly_savings WHERE saving_per_quarter[2] > saving_per_quarter[4];
修改数组的示例如下所示.
UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}' WHERE name = 'Manisha';
或使用ARRAY表达式语法 :
UPDATE monthly_savings SET saving_per_quarter = ARRAY[25000,25000,27000,27000] WHERE name = 'Manisha';
搜索数组的示例如下所示.
SELECT * FROM monthly_savings WHERE saving_per_quarter [1] = 10000 OR saving_per_quarter [2] = 10000 OR saving_per_quarter [3] = 10000 OR saving_per_quarter [4] = 10000;
如果已知数组的大小,则可以使用上面给出的搜索方法.另外,以下示例显示了如何搜索大小未知的情况.
SELECT * FROM monthly_savings WHERE 10000 = ANY(saving_per_quarter);
此类型表示字段名称及其数据类型的列表,即行的结构或者记录表.
以下示例说明如何声明复合类型
CREATE TYPE inventory_item AS( name text, supplier_id integer, price numeric );
此数据类型可在创建表中使用,如下所示;
CREATE TABLE on_hand( item inventory_item, count integer );
复合值可以作为文字常量插入,将字段值括在括号内并分隔他们用逗号.示例如下所示 :
INSERT INTO on_hand VALUES(ROW('fuzzy dice',42,1.99),1000);
这适用于上面定义的 inventory_item .只要表达式中有多个字段,ROW关键字实际上是可选的.
访问字段复合列,使用点后跟字段名称,就像从表名中选择一个字段一样.例如,要从on_hand示例表中选择一些子字段,查询将如下所示 :
SELECT(item).name FROM on_hand WHERE(item).price> 9.99;
您甚至可以使用表名(例如在多表查询中),例如这个 :
SELECT(on_hand.item).name FROM on_hand WHERE(on_hand.item).price> 9.99;
范围类型表示使用一系列数据的数据类型.范围类型可以是离散范围(例如,所有整数值1到10)或连续范围(例如,上午10:00到11:00之间的任何时间点).
可用范围类型包括以下范围 :
int4range : 整数范围
int8range : bigint范围
numrange : 数字范围
tsrange : 没有时区的时间戳范围
tstzrange : 带时区的时间戳范围
daterange : 日期范围
可以创建自定义范围类型以使新类型的范围可用,例如使用inet类型的IP地址范围使用float数据类型作为基数的base或float范围.
范围类型分别使用[]和()字符支持包含和排除范围边界.例如,'[4,9)'表示从4开始包括但不包括9的所有整数.
PostgreSQL在内部使用对象标识符(OID)作为各种系统表的主键.如果指定了 WITH OIDS 或启用了 default_with_oids 配置变量,则只有这样,在这种情况下才会将OID添加到用户创建的表中.下表列出了几种别名类型.除了专门的输入和输出例程之外,OID别名类型没有自己的操作.
名称 | 参考文献 | 描述 | 值示例 |
---|---|---|---|
oid | any | 数字对象标识符 | 564182 |
regproc | pg_proc | 函数名称 | sum |
regprocedure | pg_proc | 参数类型 | sum(int4) |
regoper | pg_operator | 运营商名称 | + |
regoperator | pg_operator | 运算符,参数类型 | *(整数,整数)或 - ( NONE,整数) |
regclass | pg_class | 关系名称 | pg_type |
regtype | pg_type | 数据类型名称 | 整数 |
regconfig | pg_ts_config | 文本搜索配置 | 英语 |
regdictionary | pg_ts_dict | 文本搜索词典 | 简单 |
PostgreSQL类型系统包含许多专用条目统称为伪类型.伪类型不能用作列数据类型,但它可用于声明函数的参数或结果类型.
下面给出的表列出了现有的伪类型./p>
S.不. | 姓名&描述 |
---|---|
1 | any 表示函数接受任何输入数据类型. |
2 | anyelement 表示函数接受任何数据类型. |
3 | anyarray 表示函数接受任何数组数据类型. |
4 | anynonarray 表示函数接受任何非数组数据类型. |
5 | anyenum 表示函数接受任何枚举数据类型. |
6 | anyrange 表示函数接受任何范围数据类型. |
7 | cstring 表示函数接受或返回以null结尾的C string. |
8 | internal 表示函数接受或返回服务器内部数据类型. |
9 | language_handler 声明一个过程语言调用处理程序返回language_handler. |
10 | fdw_handler 声明外部数据包装器处理程序返回fdw_handler. |
11 | record 标识返回未指定行类型的函数. |
12 | trigger 声明触发器函数返回触发器. |
13 | void 表示函数返回no价值. |