postgresql數據類型


數據類型

0. 數據類型的分類

分類名稱 說明 與其他數據庫對比
布爾類型 支持SQL標准boolean類型 與MYSQL中的bool,boolean類型一樣,占用1字節空間
數值類型 整數類型有2字節的smallint,2字節int 8字節bigint ;精確數字類型numeric;非精確類型的浮點小數real和double precision 還有8字節的money(貨幣類型) 無MYSQL中的unsigned類型,也無mysql中的1字節長tinint和3字節長的mediumint整數類型
字符類型 有varchar(n),char(n),text三種類型 pg中最大可存儲1G mysql中字符最大可存儲64KB,PG中的text類型相當於MYSQL中的longtext類型
二進制數據類型 bytea類型 對應的MYSQL中的blob和longblob類型
位串類型 由 0 和 1組成的字符串,有bit(n),bit varying(n)兩種類型 PG最大可支持8388080個bit位
日期和時間類型 date ,time, timestamp PG可精確到秒以下,MYSQL可精確到毫秒
枚舉類型 enum PGSQL枚舉需要預先使用create type來創建該類型
幾何類型 包括點(point),直線(line),線段(lseg),路徑(path),多邊形(polygon),圓(cycle) PG特有的類型
網絡地址類型 有cidr,inet,macaddr 類型 PG特有
數組類型 可以存儲一個數組 PG特有類型
復合類型 可以把已有的類型組合成用戶自定義類型 對應其他數據庫的自定義類型
xml XML相關數據存儲
JSON/JSONB類型 JSON類型 MYSQL在8.0后可支持
range類型 范圍類型,可存儲范圍數據
對象標識符類型 PG內部標識對象類型,如oid類型,regproc類型,regclass類型
偽類型 不能作為字段的數據類型,但他可用於聲明函數的參數或者結果的類型
UUID類型
其他類型

1. 數值類型

類型名稱 存儲長度 描述 范圍
smallint 2字節 小范圍整數類型 -3276832767(-2^152^15-1)
integer 4字節 整數類型 -21474836482147493647(-2^312^31-1)
bigint 8字節 大范圍整數類型 (-263~263-1)
decimal 可變 用戶指定精度 無限制
numeric 可變 用戶指定精度 無限制
real 4字節 變長,不精確 6位十進制精度
double precision 8字節 變長,不精確 15位十進制精度
smallserial 2字節 smallint自增序列 1~32767
serial 4字節 integer自增序列 1~2147483647 (1-2^31-1)
bigserial 8字節 bigInteger自增序列 1~922372036854775807(1-2^64-1)

注意:

  • decimal和numeric是等效的
  • real和double precison 浮點類型
  • smallSerial和serial 和bingSerial指的是自增類型,但是其實是在創建后再后面默認添加了一個函數
  • 浮點類型中還有幾個特殊值
    • Infinity
    • -Infinity
    • NaN

2. 字符類型

字符類型名稱 描述
varchar(n) 變長類型,字符最大有限制 ,最大1G 存儲空間為:4+實際字符長度。
char(n) 定長字段,沒達到最大用空白填充 最大1G ,存儲空間為4+n
text 文本類型,變長,無限制

注意:

  • 如果character varying(n)如果不聲明長度,則和text一樣,可以沒有限制長度
  • pgsql最大支持長度為1GB

2.1 字符串函數

  • 計算字符數:char_length(xxx);
  • 計算占用字節數:octet_length(xxx);
  • 位置:postition(a in b)
  • 子串:substring(str from 1 for 4)
  • 拆分字符串:split_part(String text,delimiter text,filed int)

3. 時間類型

字符類型名稱 存儲長度 描述
timestamp 8字節 包括日期和時間,不帶時區。簡寫成timestamp
Timestamp with time zone 8字節 包括時間和日期,帶時區,簡寫timestamptz
date 4字節 日期,但不包含一天中的時間
time 8字節 一天中的時間,不包含日期,不帶時區
time with time zone 12字節 一天中的時間,不包含日期,帶時區
interval 16字節 時間間隔

3.1 時間類型函數

日期相加

select date '2017-07-29'+ interval'1 days'

日期相減

select date '2017-07-29'- interval'1 days'

常用函數

  • 顯示當前時間:select current_date,current_time;
  • 抽取年月日: select extract(field from source)

時間函數

  • CURREN_DATE
  • CURRENT_TIME
  • CURRENT_TIMESTAMP
  • CURRENT_TIME(precision)
  • now()

4. 布爾類型(bool)

1 字節,狀態為true或false

5. 網絡地址類型

字符類型名稱 存儲長度 描述
cidr 7或者19字節 IPV4或者IPV6
inet 7或者19字節 IPV4或者IPV6
macaddr 6字節 MAC地址
macaddr8 8字節 MAC地址(EUI-64格式)

6. 數組類型

在創建的時候添加[]就可以變成數組類型

CREATE table text_arr1(

    id integer,

	arr_i integer[],

	arr_t text[]
)

插入

insert into text_arr1 values(1,'{1,2,3}','["dadsa","dsada"]')	
insert into text_arr1 values(1,array[1,2,3],array["dadsa","dsada"])	

數組追加:array_append(anyArr,anyElem)

數組remove: array_remove(anyArr,anyElem);

獲取數組維度:array_ndims(數組)

獲取數組的位置:array_postition(arr,findElem)

替換:array_replace(arr,sourceElem,target)

TOString:array_to_string(arr,sourceElem,target)

7. 范圍類型

  • int4range:integer范圍類型
  • int8range:bigint范圍類型
  • numrange:numeric 范圍類型
  • tsrange :不帶時區的timestamp范圍類型
  • tstzrange:帶時區的timstamp范圍類型
  • date:date范圍類型

8. json/jsonb類型

這兩種類型使用上完全一致,JSON是把輸入的數據原封不動的存儲到數據中,但是jsonb類型是在存儲的時候就把JSON解析成為了二進制類型,JSONB類型會比JSON類型效率高

8.0 JSON支持的類型

JSON的類型 PG上的類型 注意事項
string text 字符集只支持UTF-8
number numeric JSON中沒有PG中的NaN和infinity的值
boolean boolean JSON中只能接受小寫的true或者false
null none SQL中的NULL代表不同的意思

8.1 json類型

創建表

create table table_name(id serial primary key,name json);

插入數據

insert into table_name(name) value ('{"col1":"dd","col2":"col2value"}')

查詢

select * from table_name -- 全部
select name->'col2' from table_name --單字段,顯示鍵值
select name ->>'col2' from table_name -- 單獨字段,以文本格式

8.2 jsonb類型:其實就是以二進制存儲,並且會去除一些不必要的空格和刪除重復鍵

-- 將josn對象轉換成鍵值對象
select * from json_each('{"col1":"dd","col2":"col2value"}')
--以文本形式返回
select * from json_each_text('{"col1":"dd","col2":"col2value"}')
-- 將行轉換成json
select row_to_json(test_copy) from test_copy where id=1

9. 數據類型轉換

函數 返回類型 描述 實例
to_char(timestamp,text) text 把時間戳轉換成字符串 to_char(current_timestamp,"HH12:MI:SS")
to_char(interval,text) text 把間隔轉換成字符串 to_char(interval '15h 2m 12s',"HH12:MI:SS")
To_char(int,text) text 把整數類型轉換成字符串
to_char(numeric,text) text 把數字轉換成字符串
to_date(text,text) date 把字符轉換成日期
to_number(text,text) numeric 把字符轉換成數字
to_timestamp(text,text) Timestamp with time zone 把字符串轉換成時間戳
  1. 用case 轉換
select cast(varchar'123' as text);
select cast(varchar'123' as int4);	
  1. 通過::進行轉換
select 1::int4,3/2::numeric;	


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM