postgres数据库之数据类型


一 . 数据类型

一个数据表由多列字段构成,每一个字段都指定了数据类型,之后这个字段就只能存储指定数据类型的值。

PostgreSQL支持多种数据类型,主要的数据类型有整数类型、浮点类型、任意精度数值、日期与实践类型、字符串类型、布尔类型、数组类型、二进制类型。


  • 整数
类型 说明 占用空间 取值范围
smallint 小范围整数 2个字节 -32768~32767
int(integer) 普通整型 4个字节 -231~(231-1)大概正负21亿多
bigint 大整数 8个字节 -263~(263-1)大概正负922亿亿
  • 浮点数
    浮点数的类型有两种 real和double precision
数据类型 说明 占用空间 取值范围
real 精度至少6位小数 4个字节 1E-37~1E+37
double precision 精度至少是15位小数 8个字节 1E-307~1E+308

PostgreSQL也支持标准的SQL表示法,float和float(p)用户声明非精确的数值类型。p声明以二进制位表示的最低可接受精度。在使用real类型的时候,PostgreSQL接受float(1)到float(24),使用double precision类型的时候,接受float(25)到float(53)。没有声明精度的float默认被当做double precision。

create table temp_table(column1 float(5),column2 real,column3 double precision) #创建三种类型的字段 

在PostgreSQL中,浮点类型有几个特殊的值

说明
Infinity 正无穷
- Infinity 负无穷
NaN 不是一个数字
  • 任意精度类型 numeric
    在PostgreSQL中使用numeric(m,n)表示任意精度的类型,m表示精度,n表示标度。
    如: 536.188中精度为6,标度为3。如果用户数据超出指定的精度,那么会默认进行四舍五入处理。
    numeric 可以存储最多1000位精度的数字并且准确地进行计算。因此非常适合用于货币金额和其它要求计算准确的数量。不过,numeric类型上的算术运算比整数类型或者浮点数类型要慢的多。
    create table tmp1(x numric(8,2),y numeric(500,3));
    insert into tmp1 values (8889.23,556688889999987987.333);
  • 日期与时间类型
    表示日期和时间的数据类型有多种,主要包括: time、date、timestamp和interval

|数据类型|说明|占用空间|取值范围|
|:-||:-||
|time|仅存储时间|8个字节|00:00:00~24:00:00|
|date|仅存储日期|4个字节|4713 BC~5874897 AD|
|timestamp|存储日期和时间|8个字节|4713 BC~294276 AD|
|interval|时间间隔|12个字节|-178000000 年~178000000 年|
说明BC-公元前 AD-公元后

  1. 关于时区
    time类型和timestamp类型默认情况下是不带时区的,如果需要可以设置为带时区。
    alter table tmp1 alter column c1 type timestamp with time zone;
  2. 关于精度
    time、timestamp 和interval可以定义精度值p,这个精度值定义用来表示秒的小数位的个数。对于timestamp和interval,p的取值范围是0到6,默认为6,也就是可以精确到微秒。对于time,p的取值范围是0到10,默认为10。
  3. 格式
    在给字段赋值数据时十分灵活只要符合一定的格式即可,时间只要符合HH:MM:SS或HHMMSS或HHMM就可以。日期只要符合YYYYMMDD或者YYYY-MM-DD
    例如如下语句均是可以使用的
insert into tmp1 values ('10:20:22'),('102022'),('1020');
insert into tmp1 values ('20150913'),('2015-09-13');
insert into tmp1 values ('20150913 10:20:00'),(2015-09-13 22:22:00);
 
  • 字符串类型
    PostgreSQL中字符串类型指 char、varchar和text。
类型 说明
char(n)/character(n) 固定长度非二进制字符串,不足补空白
varchar(n)/character varying(n) 变长非二进制字符串,有长度限制
text 变长非二进制字符串,无长度限制

在PostgreSQL中,这三种类型的字符串数据并没有明显的性能差别,而character(n)类型的数据因为固定长度导致更多的存储空间。所以,一般来说,推荐使用text或者character varying就行了。

create table tmp_str(ch char(4),vch varchar(4),txt text);
insert into tmp_str values ('ab','cd','efghijklmn');
  • 数组类型
    PostgreSQL允许将字段定义成变长的多维数组, 数组类型可以是任何基本类型或用户定义类型。
    为说明这些用法,我们先创建一个由基本类型数组构成的表
create table tmp_array(name text,pay_by_quarter integer[5],schedule text[][]);

  如上所示,一个数组类型是通过在数组元素类型名后面附加中括号([])来命名的。目前,PostgreSQL并不强制声明数组的长度,所以上述声明长度和不声明长度是一样的。特定元素类型的数组都被认为是相同的类型, 不管他们的大小或者维数。
数组类型的使用

#插入数据
insert into tmp_array values ('array test','{1,2,3}','{{"meeting", "lunch"}, {"training", "presentation"}}');
#查询
select name from tmp_array where pay_by_quarter[1] <> pay_by_quarter[2];
select pay_by_quarter[3] from tmp_array;
  • 二进制类型
    PostgreSQL提供了bytea类型,用来存储二进制字符串

|数据类型|说明|长度|
|-||
|bytea|变长的二进制字符串|4字节加上实际的二进制字符串长度|
二进制字符串是一个字节序列。二进制字符串和普通字符字符串的区别有两个:

  1. 二进制字符串完全可以存储字节零值以及其它"不可打印的" 字节(定义在 32 到 126 范围之外的字节)。字符串不允许字节零值, 并且也不允许那些不符合选定的字符集编码的非法字节值或者字节序列。
  2. 对二进制字符串的处理实际上就是处理字节,而对字符串的处理则取决于区域设置。 简单说,二进制字符串适用于存储那些程序员认为是"原始字节"的数据, 而字符串适合存储文本。
  • 布尔类型
    PostgreSQL支持SQL标准的 boolean数据类型。 boolean只能有 true/false/unknown(用NULL表示)三种状态。

|数据类型|说明|占用空间|
|-||
|boolean|true/false/unknown|1个字节(以t或f存储)
代表真和假的有效文本,真(true/t/yes/y/on/1) 假(false/f/no/n/off/0)

create table test1 (a boolean, b text);
insert into test1 values ('t','this value is true'),('off','this value is false');
 

二 . 如何选择数据类型 

1 . 整数与浮点数 
  整数 : 不需要小数部分
  浮点数 : 需要小数部分 
2 . 日期与时间类型 
  time : 时间
  date : 日期 
  timestamp : 日期 + 时间 
3 . char 和 varacter 的特点选择 
  char : 固定长度字符 
  varacter : 可变长度字符
 

三 . 常见运算符 

1 . 运算符 
(1) . 算术运算符 
    +         -         /       *           %(求余)

(2) . 比较运算符 

  >       <        >=           <=        !=   IN      LIKE       LEAST       BENTWEEN  AND    GREATEST    

(3) . 逻辑运算符 

  TRUE      FALSE     AND     OR    NOT

 

总结 : 

 

(4) . 位运算符 

  &        |         ~         ^          <<               >>

2 . 规则 

      ①、 如果有一个或是两个参数为null,那么比较的结果为空;

                ②、若同一个运算符中两个参数都是字符串,那么比较结果按照字符串进行比较;

                ③、如果两个参数均为整数,那么在比较的时候会按照整数类型来比较;

                ④、如果一个字符串和数值类型进行比较,那么PostgreSQL数据库会自动将字符串类型转换成数值进行比较。

 

运算符的优先级:

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM