在本章中,无涯教程将讨论PostgreSQL中使用的数据类型,在创建表格时,您需要为每一列指定一种数据类型,即要在表格字段中存储的数据类型。
PostgreSQL支持多种数据类型,此外,用户可以使用 CREATE TYPE SQL命令创建自己的自定义数据类型,PostgreSQL中有不同类别的数据类型。
数值类型由2字节,4字节和8字节整数,4字节和8字节浮点数以及可选精度的小数组成。
名称 | 存储空间 | 范围 |
---|---|---|
smallint | 2个字节 | -32768至+32767 |
integer | 4个字节 | -2147483648至+2147483647 |
bigint | 8个字节 | -9223372036854775808至9223372036854775807 |
decimal | variable | 小数点前最多131072位;小数点后最多16383位数字 |
numeric | variable | 小数点前最多131072位;小数点后最多16383位数字 |
real | 4个字节 | 6位小数位数精度 |
double precision | 8个字节 | 15位小数位数精度 |
smallserial | 2个字节 | 1到32767 |
serial | 4个字节 | 1到2147483647 |
bigserial | 8个字节 | 1到9223372036854775807 |
money 类型以固定的分数精度存储货币金额,可以将 numeric,int和bigint 数据类型的值强制转换为 money。
名称 | 存储空间 | 说明 | 范围 |
---|---|---|---|
money | 8个字节 | 货币金额 | -92233720368547758758.08至+92233720368547758.07 |
下表列出了PostgreSQL中可用的通用字符类型。
S. No. | Name & 描述 |
---|---|
1 | character varying(n),varchar(n) 有限制的可变长度 |
2 | character(n),char(n) 固定长,空白填充 |
3 | text 可变的无限长度 |
bytea 数据类型允许存储二进制字符串,如下表所示。
名称 | 存储空间 | 说明 |
---|---|---|
bytea | 1或4个字节加上实际的二进制字符串 | 可变长度的二进制字符串 |
PostgreSQL支持全套SQL日期和时间类型,如下表所示。
名称 | 存储空间 | 说明 | 最低值 | 最高值 |
---|---|---|---|---|
timestamp[[p]] | 8个字节 | 日期和时间(无时区) | 公元前4713 | 公元294276 |
TIMESTAMPTZ | 8个字节 | 日期和时间(带时区) | 公元前4713 | 公元294276 |
date | 4个字节 | 日期 | 公元前4713 | 公元5874897 |
time[(p)] | 8个字节 | 时间 | 00:00:00 | 24:00:00 |
interval[fields] [(p)] | 12个字节 | 时间间隔 | -178000000年 | 178000000年 |
PostgreSQL提供了标准的SQL类型Boolean。布尔数据类型可以具有状态 true , false 和第三状态 unknown ,这由SQL空值表示。
名称 | 存储空间 | 说明 |
---|---|---|
boolean | 1个字节 | 正确或错误的状态 |
枚举(枚举)类型是包含静态的,有序的一组值的数据类型。它们等效于多种编程语言支持的枚举类型。
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
枚举一旦创建,便可以像其他任何类型一样使用。
PostgreSQL提供了用于存储IPv4,IPv6和MAC地址的数据类型。
名称 | 存储空间 | 说明 |
---|---|---|
cidr | 7或19个字节 | IPv4和IPv6网络 |
inet | 7或19个字节 | IPv4和IPv6主机和网络 |
macaddr | 6个字节 | MAC地址 |
位字符串类型用于存储位掩码,它们是0或1,有两种SQL位类型:bit(n)和bit variant(n),其中n是正整数。
此类型支持全文本搜索,即通过自然语言文档集合进行搜索以找到最匹配查询。为此有两种数据类型-
S. No. | Name & 描述 |
---|---|
1 | tsvector 这是不同单词的排序列表,这些单词已经过归一化以合并同一单词的不同变体,称为"lexemes"。 |
2 | tsquery 这将存储要搜索的词素,并将它们结合起来以遵循布尔运算符&(AND),|。(OR),和!(不)。括号可用于强制对运算符进行分组。 |
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对象表示法)数据,这样的数据也可以存储为 text ,但是 json 数据类型具有检查每个存储的值都是有效JSON值的优点。还提供了相关的支持功能,这些功能可以直接用于处理JSON数据类型,如下所示。
Example | Example输出 |
---|---|
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';
搜索数组的如下所示。
链接:https://www.learnfk.comhttps://www.learnfk.com/postgresql/postgresql-data-types.html
来源:LearnFk无涯教程网
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 am和11:00 am之间的任何时间点)。
可用的内置范围类型包括以下范围-
int4range - 整数范围
int8range - bigint的范围
numrange - 数字范围
tsrange - 不带时区的时间戳范围
tstzrange - 带时区的时间戳范围
daterange - 日期范围
可以创建自定义范围类型以提供新的范围类型,如,以inet类型为基础的IP地址范围,或以float数据类型为基础的float范围。
范围类型分别使用[]和()字符支持包含范围和排除范围边界。如," [4,9)"表示所有从4开始并包括4到但不包括9的整数。
PostgreSQL类型系统包含许多专用条目,这些条目统称为伪类型,伪类型不能用作列数据类型,但可以用来声明函数的参数或输出类型。
S. No. | Name & 描述 |
---|---|
1 | any 指示函数接受任何输入数据类型。 |
2 | anyelement 指示函数接受任何数据类型。 |
3 | anyarray 指示函数接受任何数组数据类型。 |
4 | anynonarray 指示函数接受任何非数组数据类型。 |
5 | anyenum 指示函数接受任何枚举数据类型。 |
6 | anyrange 指示函数接受任何范围数据类型。 |
7 | cstring 指示函数接受或返回以Null结尾的C字符串。 |
8 | internal 指示函数接受或返回服务器内部数据类型。 |
9 | language_handler 声明了过程语言调用处理程序以返回language_handler。 |
10 | fdw_handler 声明了外部数据包装器处理程序以返回fdw_handler。 |
11 | record 标识返回未指定行类型的函数。 |
12 | trigger 声明一个触发器函数以返回触发器。 |
13 | void 指示函数不返回任何值。 |
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)