主頁 > 資料庫 > PostgreSQL的資料型別

PostgreSQL的資料型別

2020-09-10 06:45:47 資料庫

1.1 資料型別

PostgreSQL 有著豐富的資料型別可用, 用戶可以使用 CREATE TYPE 命令為 PostgreSQL 增加新的資料型別,

Table1-1顯示了所有內置的普通資料型別, 在"別名"列里列出的大多數可選名字都是因歷史原因 PostgreSQL 在內部使用的名字,

另外,還有一些內部使用的或者廢棄的型別也可以用,但沒有在這里列出,

Table1-1: 資料型別

名字別名描述
bigint int8 有符號 8 位元組整數
bigserial serial8 自增八位元組整數
bit [ (n) ]   定長位串
bit varying [ (n) ] varbit 變長位串
boolean bool 邏輯布爾量 (真/假)
box   平面中的長方形
bytea   二進制資料("位元組陣列")
character varying [ (n) ] varchar [ (n) ] 變長字串
character [ (n) ] char [ (n) ] 定長字串
cidr   IPv4 或者 IPv6 網路地址
circle   平面中的圓
date   日歷日期(年,月,日)
double precision float8 雙精度浮點數字
inet   IPv4 或者 IPv6 網路地址
integer intint4 四位元組長有符號整數
interval [ (p) ]   時間間隔
line   平面中的無限長直線
lseg   平面中的線段
macaddr   MAC 地址
money   貨幣金額
numeric [ (ps) ] decimal [ (ps) ] 可選精度的準確數字
path   平面中的幾何路徑
point   平面中的點
polygon   平面中的封閉幾何路徑
real float4 單精度浮點數
smallint int2 有符號兩位元組整數
serial serial4 自增四位元組整數
text   變長字串
time [ (p) ] [ without time zone ]   一天里的時間
time [ (p) ] with time zone timetz 一天里的時間,包括時區
timestamp [ (p) ] [ without time zone ]   日期和時間
timestamp [ (p) ] with time zone timestamptz 日期和時間

兼容性: 下列型別(或者那樣拼寫的)是SQL宣告的: bitbit varyingboolean, charcharactercharacter varyingvarchardate, double precisioninteger, intervalnumericdecimal, realsmallinttime (包括有時區和無時區的), timestamp (包括有時區和無時區的),

每種資料型別都有一個由其輸入和輸出函式決定的外部表現形式, 許多內建的型別有明顯的格式,不過,許多型別要么是 PostgreSQL 所特有的,比如幾何路徑,要么可能是有幾種不同的格式,比如日期和時間型別, 有些輸入和輸出函式是不可逆的,也就是說,輸出函式的輸出結果和原始的輸入比較的時候可能丟失精度,

在創建pgsql資料庫表時,如果要給主鍵設定資料型別可以參考上表資料名稱,例如,在創建表sl_log_exception時,主鍵id設定資料型別為serial,創建完成查看表結構主鍵id,會顯示索引,

 

 

1.2 數值型別

數值型別由2、4或8位元組的整數以及4或8位元組的浮點數和可選精度小陣列成, Table 1-2 列出了所有可用型別,

Table 1-2. 數值型別

名字存盤空間描述范圍
smallint 2 位元組 小范圍整數 -32768 到 +32767
integer 4 位元組 常用的整數 -2147483648 到 +2147483647
bigint 8 位元組 大范圍的整數 -9223372036854775808 到 9223372036854775807
decimal 變長 用戶宣告精度,精確 無限制
numeric 變長 用戶宣告精度,精確 無限制
real 4 位元組 變精度,不精確 6 位十進制數字精度
double precision 8 位元組 變精度,不精確 15 位十進制數字精度
serial 4 位元組 自增整數 1 到 +2147483647
bigserial 8 位元組 大范圍的自增整數 1 到 9223372036854775807

1.2.1. 整數型別

型別 smallintinteger,和 bigint 存盤各種范圍的全部是數字的數,也就是沒有小數部分的數字, 如果存盤超出范圍以外的數值將導致錯誤,

常用的型別是 integer,因為它提供了在范圍,存盤空間, 和性能之間的最佳平衡,一般只有在磁盤空間緊張的時候才使用 smallint,而只有在 integer 的范圍不夠的時候才使用 bigint

bigint 型別可能不是在所有平臺上都運轉正確, 因為它依賴編譯器對八位元組整數的支持,在那些沒有這樣支持的機器上, bigint 的作用和 integer 一樣(但是仍然占據八位元組存盤),

SQL只宣告了整數型別 integer(或int)和 smallint,型別 bigint,和型別名 int2int4,和 int8 都是擴展, 也在許多其它 SQL 資料庫系統中使用,

1.2.2. 任意精度數值

型別 numeric 可以存盤最多1000位精度的數字并且準確地進行計算, 我們特別建議將它用于貨幣金額和其它要求計算準確的數量,不過,numeric 型別上的算術運算比整數型別或者浮點數型別要慢很多,

numeric 欄位的最大精度和最大比例都是可以配置的,要宣告一個型別為 numeric 的欄位,你可以用下面的語法

NUMERIC(precision, scale)

精度必須為正數,比例可以為零或者正數, 另外,

NUMERIC(precision)

選擇了 0 為比例,不帶任何精度或者比例宣告

NUMERIC

則創建一個可以存盤一個直到實作精度上限的任意精度和比例的數值, 一個這樣型別的欄位將不會把輸入數值轉化成任何特定的比例, 而帶有比例宣告的 numeric 欄位將把輸入值轉化為該比例,(SQL標準要求預設的比例是 0,也就是轉化成整數精度,)

如果一個要存盤的數值的比例比欄位宣告的比例高, 那么系統將嘗試圓整(四舍五入)該數值到指定的小數位, 然后,如果小數點左邊的資料位數超過了宣告的精度減去宣告的比例, 那么會拋出一個錯誤,

數值資料值物理上是不帶任何前導或者后綴零的形式存盤的, 因此,欄位上宣告的精度和比例都是最大值,而不是固定分配的,(在這個方面,numeric 型別更類似于 varchar(n), 而不像 char(n),) 實際存盤是每四個十進制位兩個位元組,然后在整個資料上加上八個位元組的額外開銷,

除了普通的數字值之外,numeric 型別允許特殊值 NaN, 表示"不是一個數字",任何在 NaN 上面的操作都生成另外一個 NaN, 如果在 SQL 命令里把這些值當作一個常量寫,你必須在其周圍放上單引號,比如 UPDATE table SET x = 'NaN',在輸入時,字串 NaN當作大小寫無關看待,

型別 decimal 和 numeric 是等效的, 兩種型別都是SQL標準,

1.2.3. 浮點數型別

資料型別 real 和 double precision 是不準確的,變精度的數字型別, 實際上,這些型別是 IEEE 標準 754 二進制浮點數算術(分別對應單和雙精度)的一般實作, 外加下層處理器,作業系統和編譯器對它的支持,

不準確意味著一些數值不能準確地轉換成內部格式并且是以近似的形式存盤的,因此存盤然后把資料再列印出來可能顯示一些缺失, 處理這些錯誤以及這些錯誤是如何在計算中傳播的屬于數學和計算機科學的一個完整的分支, 這里的討論僅限于如下幾點:

  • 如果你要求準確的計算(比如計算貨幣金額),應使用 numeric 型別,

  • 如果你想用這些型別做任何重要的復雜計算,尤其是那些你對范圍情況(無窮,下溢)嚴重依賴的事情,那你應該仔細評詁你的實作,

  • 拿兩個浮點數值進行相等性比較可能象,也可能不象想像那樣運轉,

通常,real 型別的范圍是至少 -1E+37 到 +1E+37, 精度至少是 6 位小數,double precision 型別通常有 -1E+308 到 +1E+308 的范圍,精度是至少 15 位數字,太大或者太小的數值都會導致錯誤, 

除了普通的數字值之外,浮點型別還有幾個特殊值:

Infinity
-Infinity
NaN
這些值分別表示 IEEE 754 特殊值"正無窮大","負無窮大", 以及"不是一個數字",(在不遵循 IEEE 754 浮點算術的機器上,這些值的含義可能不是預期的)如果在 SQL 命令里把這些數值當作常量寫,你必須在它們周圍放上單引號, 像這樣 UPDATE table SET x = 'Infinity', 輸入時,這些值是以大小寫無關的方式識別的,

PostgreSQL 還支持 SQL 標準表示法 float 和 float(p) 用于宣告非精確的數值型別, 在這里,p 宣告以二進制位表示的最低可接受精度, 在選取 real 型別的時候,PostgreSQL 接受 float(1) 到 float(24),在選取 double precision 的時候,接受 float(25) 到 float(53),在允許范圍之外的 p 值將導致一個錯誤, 沒有宣告精度的 float 將被當作是 double precision

注意: 在 PostgreSQL 7.4 以前,在 float(p) 里面的精度會被當作是這么多位數的十進制位,到 7.4 已經被修改成與 SQL 標準匹配,標準宣告這個精度是以二進制位度量的,假設 real 和 double precision 分別有 24 和 53 個二進制位的位數對 IEEE 標準的浮點實作來說是正確的, 在非 IEEE 平臺上,這個數值可能略有偏差,但是為了簡化,我們在所有平臺上都用了同樣的 p 值范圍,

1.2.4. Serial(序號)型別

serial 和 bigserial 型別不是真正的型別, 只是為在表中設定唯一標識做的概念上的便利,(類似其它一些資料庫中的 AUTO_INCREMENT 屬性),下面一句話:

CREATE TABLE tablename (
    colname SERIAL
);

等價于宣告下面幾句話:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename(
    colname integer DEFAULT nextval('tablename_colname_seq') NOT NULL
);

因此,我們就創建了一個整數欄位并且把它的預設數值安排為從一個序列發生器取值, 應用了一個 NOT NULL 約束以確保空值不會被明確地插入, 在大多數情況下你可能還希望附加一個 UNIQUE 或者 PRIMARY KEY 約束避免意外地插入重復的數值,但這個不是自動發生的,

注意: 在 PostgreSQL 7.3 以前,serial 隱含 UNIQUE,但現在不再如此, 如果你希望一個序列欄位有一個唯一約束或者一個主鍵,那么你現在必須宣告,就像其它資料型別一樣,

要使用 serial 欄位插入序列的下一個數值到表中, 主要是要注意 serial 應該賦予預設值, 我們可以通過在 INSERT 陳述句中把該欄位排除在欄位串列之外來實作, 也可以通過使用 DEFAULT 關鍵字來實作,

型別名 serial 和 serial4 是等效的: 兩個都創建 integer 欄位,型別名 bigserial 和 serial8 也一樣,只不過它創建一個 bigint 欄位, 如果你預計在表的生存期中使用的標識數目超過 231 個,那么你應該使用 bigserial

一個 serial 型別創建的序列在所屬的欄位被洗掉的時候自動洗掉,其它情況下是不會被洗掉的, (這一點在 PostgreSQL 版本 7.3 之前可不是真的,請注意,這種自動洗掉的關聯在通過多載 7.3 以前的資料庫轉儲的時候可不會自動發生; 那樣的轉儲檔案不包含需要建立這種關聯關系的資訊,) 另外,這樣的序列和欄位之間的依賴性只在 serial 欄位本身上有; 如果任何其它欄位參考了序列(可能是手工呼叫 nextval 函式), 那么,如果這個序列被洗掉了,它們就會被破壞,我們認為這樣使用 serial 欄位是一種不好的形式,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/1173.html

標籤:PostgreSQL

上一篇:postgresql 和 mysql 資料庫備份恢復以及時區問題

下一篇:centos7安裝PostgreSQL12

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more