數據類型
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 | 把字符串轉換成時間戳 |
- 用case 轉換
select cast(varchar'123' as text);
select cast(varchar'123' as int4);
- 通過
::
進行轉換
select 1::int4,3/2::numeric;