📅  最后修改于: 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。布尔数据类型可以具有状态true , false和第三个状态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(通用唯一标识符)是由小写的十六进制数字组成的序列,在由连字符分隔的几组中,特别是一组八位数字,然后是三组四位数,然后是一组12位数字,用于总共32位数字,代表128位。
UUID的示例是-550e8400-e29b-41d4-a716-446655440000
XML数据类型可用于存储XML数据。为了存储XML数据,首先必须使用xmlparse函数创建XML值,如下所示-
XMLPARSE (DOCUMENT '
PostgreSQL Tutorial
...
')
XMLPARSE (CONTENT 'xyzbar foo ')
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. |