📜  PostgreSQL-数据类型

📅  最后修改于: 2020-11-26 06:14:56             🧑  作者: Mango


在本章中,我们将讨论PostgreSQL中使用的数据类型。创建表时,为每一列指定一种数据类型,即要存储在表字段中的数据类型。

这带来了几个好处-

  • 一致性-对相同数据类型的列进行操作可获得一致的结果,通常是最快的。

  • 验证-正确使用数据类型意味着数据的格式验证和数据类型范围之外的数据拒绝。

  • 紧凑性-由于列可以存储一种类型的值,因此它以紧凑的方式存储。

  • 性能-正确使用数据类型可以最有效地存储数据。存储的值可以快速处理,从而提高了性能。

PostgreSQL支持多种数据类型。此外,用户可以使用CREATE TYPE SQL命令创建自己的自定义数据类型。 PostgreSQL中有不同类别的数据类型。它们在下面讨论。

数值类型

数值类型包括2字节,4字节和8字节整数,4字节和8字节浮点数以及可选精度的小数。下表列出了可用的类型。

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 up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
numeric variable user-specified precision,exact up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
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

货币类型

货币类型以固定的分数精度存储货币金额。可以将numeric,int和bigint数据类型的值转换为money 。不建议使用浮点数来处理资金,因为可能会舍入错误。

Name Storage Size Description Range
money 8 bytes currency amount -92233720368547758.08 to +92233720368547758.07

字符类型

下表列出了PostgreSQL中可用的通用字符类型。

S. No. Name & Description
1

character varying(n), varchar(n)

variable-length with limit

2

character(n), char(n)

fixed-length, blank padded

3

text

variable unlimited length

二进制数据类型

bytea数据类型允许存储二进制字符串,如下表所示。

Name Storage Size Description
bytea 1 or 4 bytes plus the actual binary string variable-length binary string

日期/时间类型

PostgreSQL支持全套SQL日期和时间类型,如下表所示。日期根据公历进行计数。在这里,所有类型的分辨率均为1微秒/ 14位数字,日期类型除外,其分辨率为day

Name Storage Size Description Low Value High Value
timestamp [(p)] [without time zone ] 8 bytes both date and time (no time zone) 4713 BC 294276 AD
TIMESTAMPTZ 8 bytes both date and time, with time zone 4713 BC 294276 AD
date 4 bytes date (no time of day) 4713 BC 5874897 AD
time [ (p)] [ without time zone ] 8 bytes time of day (no date) 00:00:00 24:00:00
time [ (p)] with time zone 12 bytes times of day only, with time zone 00:00:00+1459 24:00:00-1459
interval [fields ] [(p) ] 12 bytes time interval -178000000 years 178000000 years

布尔型

PostgreSQL提供标准的SQL类型Boolean。布尔数据类型可以具有状态truefalse和第三个状态unknown ,这由SQL空值表示。

Name Storage Size Description
boolean 1 byte state of true or false

枚举类型

枚举(枚举)类型是包含静态的,有序的一组值的数据类型。它们等效于多种编程语言支持的枚举类型。

与其他类型不同,枚举类型需要使用CREATE TYPE命令创建。此类型用于存储静态的,有序的值集。例如指南针方向,即北,南,东和西或一周中的几天,如下所示-

CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');

枚举一旦创建,便可以像其他任何类型一样使用。

几何类型

几何数据类型表示二维空间对象。最基本的类型,即要点,构成了所有其他类型的基础。

Name Storage Size Representation Description
point 16 bytes Point on a plane (x,y)
line 32 bytes Infinite line (not fully implemented) ((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 Closed path (similar to polygon) ((x1,y1),…)
path 16+16n bytes Open path [(x1,y1),…]
polygon 40+16n Polygon (similar to closed path) ((x1,y1),…)
circle 24 bytes Circle <(x,y),r> (center point and radius)

网络地址类型

PostgreSQL提供了用于存储IPv4,IPv6和MAC地址的数据类型。最好使用这些类型而不是纯文本类型来存储网络地址,因为这些类型提供输入错误检查以及专门的运算符和功能。

Name Storage Size Description
cidr 7 or 19 bytes IPv4 and IPv6 networks
inet 7 or 19 bytes IPv4 and IPv6 hosts and networks
macaddr 6 bytes MAC addresses

位串类型

位字符串类型用于存储位掩码。它们是0或1。有两种SQL位类型: bit(n)bit variant(n) ,其中n是一个正整数。

文字搜寻类型

此类型支持全文本搜索,即通过自然语言文档集合进行搜索以找到最匹配查询的文档的活动。有两种数据类型-

S. No. Name & Description
1

tsvector

This is a sorted list of distinct words that have been normalized to merge different variants of the same word, called as “lexemes”.

2

tsquery

This stores lexemes that are to be searched for, and combines them honoring the Boolean operators & (AND), | (OR), and ! (NOT). Parentheses can be used to enforce grouping of the operators.

UUID类型

UUID(通用唯一标识符)是由小写的十六进制数字组成的序列,在由连字符分隔的几组中,特别是一组八位数字,然后是三组四位数,然后是一组12位数字,用于总共32位数字,代表128位。

UUID的示例是-550e8400-e29b-41d4-a716-446655440000

XML类型

XML数据类型可用于存储XML数据。为了存储XML数据,首先必须使用xmlparse函数创建XML值,如下所示-

XMLPARSE (DOCUMENT '

PostgreSQL Tutorial 
   ...
')

XMLPARSE (CONTENT 'xyzbarfoo')

JSON类型

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”}

数组类型

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);

这对上面定义的stocker_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 am和11:00 am之间的任何时间点)。

可用的内置范围类型包括以下范围-

  • int4range-整数范围

  • int8range -bigint的范围

  • numrange-数值范围

  • tsrange-没有时区的时间戳范围

  • tstzrange-带有时区的时间戳范围

  • daterange-日期范围

可以创建自定义范围类型以提供新的范围类型,例如,以inet类型为基础的IP地址范围,或以float数据类型为基础的float范围。

范围类型分别使用[]和()字符支持包含范围和排除范围边界。例如,“ [4,9)”表示所有从4开始并包括4到但不包括9的整数。

对象标识符类型

PostgreSQL内部使用对象标识符(OID)作为各种系统表的主键。如果指定了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

伪类型

PostgreSQL类型系统包含许多专用条目,这些条目统称为伪类型。伪类型不能用作列数据类型,但可以用来声明函数的参数或结果类型。

下表列出了现有的伪类型。

S. No. Name & Description
1

any

Indicates that a function accepts any input data type.

2

anyelement

Indicates that a function accepts any data type.

3

anyarray

Indicates that a function accepts any array data type.

4

anynonarray

Indicates that a function accepts any non-array data type.

5

anyenum

Indicates that a function accepts any enum data type.

6

anyrange

Indicates that a function accepts any range data type.

7

cstring

Indicates that a function accepts or returns a null-terminated C string.

8

internal

Indicates that a function accepts or returns a server-internal data type.

9

language_handler

A procedural language call handler is declared to return language_handler.

10

fdw_handler

A foreign-data wrapper handler is declared to return fdw_handler.

11

record

Identifies a function returning an unspecified row type.

12

trigger

A trigger function is declared to return trigger.

13

void

Indicates that a function returns no value.