Postgresql 简明教程
PostgreSQL - Data Type
在本章中,我们将讨论 PostgreSQL 中使用的数据类型。创建表时,对于每一列,您需要指定一种数据类型,即您希望存储在表字段中的数据类型。
这有几个好处:
-
Consistency - 相同数据类型列上的操作提供一致的结果,并且通常是最快的。
-
Validation - 正确使用数据类型意味着在数据类型范围内验证数据格式并拒绝数据。
-
Compactness - 由于一列只可以存储一种类型的值,所以它将以紧凑的方式存储。
-
Performance - 正确使用数据类型可提供最高效的数据存储。存储的值可以快速处理,从而提高性能。
PostgreSQL 支持多种数据类型。此外,用户可以使用 CREATE TYPE SQL 命令创建自己的自定义数据类型。PostgreSQL 中有不同的数据类型类别。它们将在下面讨论。
Numeric Types
数值类型由两字节、四字节和八字节整数、四字节和八字节浮点数以及可选精度的十进制数组成。下表列出了可用的类型。
Name |
Storage Size |
Description |
Range |
smallint |
2 bytes |
small-range integer |
-32768 to +32767 |
integer |
4 bytes |
typical choice for integer |
-2147483648 to +2147483647 |
bigint |
8 bytes |
large-range integer |
-9223372036854775808 to 9223372036854775807 |
decimal |
variable |
user-specified precision,exact |
小数点前最多 131072 位数字;小数点后最多 16383 位数字 |
numeric |
variable |
user-specified precision,exact |
小数点前最多 131072 位数字;小数点后最多 16383 位数字 |
real |
4 bytes |
variable-precision,inexact |
6 decimal digits precision |
double precision |
8 bytes |
variable-precision,inexact |
15 decimal digits precision |
smallserial |
2 bytes |
small autoincrementing integer |
1 to 32767 |
serial |
4 bytes |
autoincrementing integer |
1 to 2147483647 |
bigserial |
8 bytes |
large autoincrementing integer |
1 to 9223372036854775807 |
Monetary Types
money 类型以固定的分数精度存储货币金额。numeric、int 和 bigint 数据类型的值可以转换为 money。由于存在舍入误差的可能性,因此不建议使用浮点数来处理货币。
Name |
Storage Size |
Description |
Range |
money |
8 bytes |
currency amount |
-92233720368547758.08 to +92233720368547758.07 |
Character Types
下表列出了 PostgreSQL 中提供的通用字符类型。
S. No. |
Name & Description |
1 |
character varying(n), varchar(n) 带有长度限制的可变长度 |
2 |
character(n), char(n) fixed-length, blank padded |
3 |
text variable unlimited length |
Binary Data Types
bytea 数据类型允许存储二进制字符串,如下表所示。
Name |
Storage Size |
Description |
bytea |
1 或 4 个字节加上实际的二进制字符串 |
variable-length binary string |
Date/Time Types
PostgreSQL 支持全套 SQL 日期和时间类型,如下表所示。日期根据公历计算。在此,所有类型的分辨率为 1 microsecond / 14 digits ,除了 date 类型,其分辨率为 day 。
Name |
Storage Size |
Description |
Low Value |
High Value |
timestamp [(p)] [without time zone ] |
8 bytes |
日期和时间(没有时区) |
4713 BC |
294276 AD |
TIMESTAMPTZ |
8 bytes |
日期和时间,有时区 |
4713 BC |
294276 AD |
date |
4 bytes |
日期(无时间) |
4713 BC |
5874897 AD |
time [ (p)] [ without time zone ] |
8 bytes |
时间(无日期) |
00:00:00 |
24:00:00 |
time [ (p)] with time zone |
12 bytes |
仅时间,带时区 |
00:00:00+1459 |
24:00:00-1459 |
interval [fields ] [(p) ] |
12 bytes |
time interval |
-178000000 years |
178000000 years |
Boolean Type
PostgreSQL 提供标准 SQL 类型 Boolean。Boolean 数据类型可以具有 true、false 状态以及第三个状态 unknown,它由 SQL null 值表示。
Name |
Storage Size |
Description |
boolean |
1 byte |
true 或 false 状态 |
Enumerated Type
枚举 (enum) 类型是一种包含静态有序值集的数据类型。它们相当于许多编程语言中支持的枚举类型。
与其他类型不同,枚举类型需要使用 CREATE TYPE 命令来创建。此类型用于存储静态有序值集。例如,罗盘方向(即 NORTH、SOUTH、EAST 和 WEST)或如下所示的星期几:
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
枚举创建后,可以像任何其他类型一样使用。
Geometric Type
几何数据类型表示二维空间对象。最基本类型,点,构成了所有其他类型。
Name |
Storage Size |
Representation |
Description |
point |
16 bytes |
Point on a plane |
(x,y) |
line |
32 bytes |
无限线(未完全实现) |
x1,y1),(x2,y2 |
lseg |
32 bytes |
Finite line segment |
x1,y1),(x2,y2 |
box |
32 bytes |
Rectangular box |
x1,y1),(x2,y2 |
path |
16+16n bytes |
闭合路径(类似多边形) |
((x1,y1),…) |
path |
16+16n bytes |
Open path |
[(x1,y1),…] |
polygon |
40+16n |
多边形(类似闭合路径) |
((x1,y1),…) |
circle |
24 bytes |
Circle |
<(x,y),r>(圆心和半径) |
Network Address Type
PostgreSQL 提供数据类型来存储 IPv4、IPv6 和 MAC 地址。最好使用这些类型而不是纯文本类型来存储网络地址,因为这些类型提供了输入错误检查和专用运算符和函数。
Name |
Storage Size |
Description |
cidr |
7 or 19 bytes |
IPv4 and IPv6 networks |
inet |
7 or 19 bytes |
IPv4 和 IPv6 主机和网络 |
macaddr |
6 bytes |
MAC addresses |
Text Search Type
此类型支持全文搜索,它是一种在自然语言文档集合中搜索最能匹配查询的文档的活动。为此,有两种数据类型:
S. No. |
Name & Description |
1 |
tsvector 这是经过标准化以合并相同单词的不同变体(称为“词素”)的唯一单词的有序列表。 |
2 |
tsquery 它存储要搜索的词素,并将它们与布尔运算符 &(AND)匹配。 |
UUID Type
UUID(通用唯一标识符)被写成一串小写十六进制数字,分为几组,并用连字符分隔,具体来说,一组八位数字,后面跟着三组四位数字,再跟着一组 12 位数字,总共 32 位数字表示 128 位。
UUID 的一个示例是 - 550e8400-e29b-41d4-a716-446655440000
XML Type
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 Type
json 数据类型可用于存储 JSON(JavaScript 对象表示法)数据。此类数据也可以存储为文本,但 json 数据类型具有检查每个存储值是有效 JSON 值的优点。还有可用的相关支持函数,可直接用于处理 JSON 数据类型,如下所示。
Example |
Example Result |
array_to_json('{{1,5},{99,100}}'::int[]) |
[[1,5],[99,100]] |
row_to_json(row(1,'foo')) |
{"f1":1,"f2":"foo"} |
Array Type
PostgreSQL 提供将表的列定义为变长多维数组的机会。任何内置或用户定义的基本类型、枚举类型或复合类型的数组都可以创建。
Declaration of Arrays
数组类型可以声明为
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[][]
);
Inserting values
数组值可以作为一个文字常量插入,用大括号将元素值括起来,并用逗号分隔。以下是一个示例:
INSERT INTO monthly_savings
VALUES (‘Manisha’,
‘{20000, 14600, 23500, 13250}’,
‘{{“FD”, “MF”}, {“FD”, “Property”}}’);
Accessing Arrays
下面显示访问数组的示例。下面给出的命令将选择第二季度储蓄高于第四季度的那些人。
SELECT name FROM monhly_savings WHERE saving_per_quarter[2] > saving_per_quarter[4];
Modifying Arrays
下面显示修改数组的示例。
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';
Searching Arrays
下面显示搜索数组的示例。
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);
Composite Types
此类型表示字段名称及其数据类型的列表,即表的行或记录的结构。
Declaration of Composite Types
以下示例显示如何声明复合类型
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);
可以在创建表中使用此数据类型,如下所示 −
CREATE TABLE on_hand (
item inventory_item,
count integer
);
Range Types
范围类型表示使用数据范围的数据类型。范围类型可以是离散范围(例如,所有整数值 1 到 10)或连续范围(例如,上午 10:00 到上午 11:00 之间的任何时间点)。
可用的内置范围类型包括以下范围 −
-
int4range − 整数范围
-
int8range − bigint 范围
-
numrange − numeric 范围
-
tsrange − 无时区的 timestamp 范围
-
tstzrange − 时区的 timestamp 范围
-
daterange − 日期范围
可以创建自定义范围类型以使新类型的范围可用,例如将 inet 类型用作基础的 IP 地址范围,或将 float 数据类型用作基础的 float 范围。
范围类型使用 [ ] 和 ( ) 字符分别支持包含和不包含的范围边界。例如,“[4,9)” 表示从 4 及其本身开始至但不到 9 的所有整数。
Object Identifier Types
对象标识符 (OID) 由 PostgreSQL 在内部用作各种系统表的初级关键字。如果指定了 WITH OIDS 或启用了 default_with_oids 配置变量,则只有在这些情况下,才将 OID 添加到用户创建的表中。下表列出多条别名类型。除了专门的输入和输出例程外,OID 别名类型没有自己的操作。
Name |
References |
Description |
Value Example |
oid |
any |
numeric object identifier |
564182 |
regproc |
pg_proc |
function name |
sum |
regprocedure |
pg_proc |
function with argument types |
sum(int4) |
regoper |
pg_operator |
operator name |
+ |
regoperator |
pg_operator |
operator with argument types |
*(integer,integer) or -(NONE,integer) |
regclass |
pg_class |
relation name |
pg_type |
regtype |
pg_type |
data type name |
integer |
regconfig |
pg_ts_config |
text search configuration |
English |
regdictionary |
pg_ts_dict |
text search dictionary |
simple |
Pseudo Types
PostgreSQL 类型系统包含许多特殊用途的条目,这些条目统称为伪类型。伪类型不能用作列数据类型,但可以用作声明函数的参数或结果类型。
下表列出了一些现有的伪类型。
S. No. |
Name & Description |
1 |
any 表示函数接受任何输入数据类型。 |
2 |
anyelement 表示函数接受任何数据类型。 |
3 |
anyarray 表示函数接受任何数组数据类型。 |
4 |
anynonarray 表示函数接受任何非数组数据类型。 |
5 |
anyenum 表示函数接受任何枚举数据类型。 |
6 |
anyrange 表示函数接受任何范围数据类型。 |
7 |
cstring 表示函数接受或返回一个以 NULL 结尾的 C 字符串。 |
8 |
internal 表示函数接受或返回一个服务器内部数据类型。 |
9 |
声明了一个过程语言调用处理程序返回 language_handler。 |
10 |
fdw_handler 声明了一个外部数据包装器处理程序返回 fdw_handler。 |
11 |
record 标识一个返回未指定行类型的函数。 |
12 |
trigger 声明了一个触发器函数返回 trigger。 |
13 |
void 表示函数没有返回值。 |