在建立資料表的過程中,我們需要對新建立的資料表定義欄位結構。
每個欄位都必須給它屬性,例如 文字、數字、日期 這些最常見。
我們前幾天有建立一張 animals 資料表,sql 語法如下
CREATE TABLE animals (
id bigserial,
name varchar(255),
created_at timestamp,
updated_at timestamp
);
- bigserial 遞增型的八位元整數
- varchar 自動適應的字串最大255字元
- timestamp 日期與時間
之前有說明過,但還有很多資料類型!
文字
資料類型 | 說明 |
---|---|
char(n) | 標準SQL的類型之一,假設 char(10) 如果你只存入5個字,其他會以空白補滿!固定長度10個字元,目前這方式比較少見了!但還是有一些格式的內容可以這樣使用 |
varchar(n) | 標準SQL的類型之一,長度不固定,假設 varchar(20) 表示最大可以存入20個字元,目前比較常見的文字資料類型,可以節省很多儲存空間。 |
text | 非標準SQL的類型,但其他資料庫(MySQL)也有這樣的作法,長度可以任意變化,看PostgreSQL官方文件表示字元長度可以達到 1 gigabyte |
數字
整數
資料類型 | 儲存空間 | 範圍 |
---|---|---|
smallint | 2bytes | -32768 ~ +32767 |
integer | 4bytes | -2147483648 ~ +2147483647 |
bigint | 8bytes | -9223372036854775808 ~ +9223372036854775807 |
以上三種看你的資料範圍會落在哪裡,儲存空間越大自然也越佔空間,員工編號就可以使用integer就好!我想一間公司應該不會有21億個員工。
如果範圍小於三萬 smallint 就是一個明智的選擇。
自動遞增的整數
如上 animals 資料表的 id 就是使用 bigserial 自動遞增的欄位
資料類型 | 儲存空間 | 範圍 |
---|---|---|
smallserial | 2bytes | 1 ~ 32767 |
serial | 4bytes | 1 ~ 2147483647 |
bigserial | 8bytes | 1 ~ 9223372036854775807 |
小數點
小數點分為定點數以及浮點數,例如 123.456 這串數字的 「.」 的位置,會不會變動區分。
如果欄位設定總共5個數字(包含小數點後的數字),小數點後2位,這就是定點數 100.00 、 123.45
資料類型 | 儲存空間 | 儲存類型 | 範圍 |
---|---|---|---|
numeric, decimal | 可變 | 定點數 | 最多小數點前131072位數,小數點後16383位數 |
real | 4bytes | 浮點數 | 6位數精度 |
double precision | 8bytes | 浮點數 | 15位數精度 |
日期時間
資料類型 | 儲存空間 | 說明 | 範圍 |
---|---|---|---|
timestamp | 8bytes | 日期與時間 | 史前4713年到西元294276年 |
date | 4bytes | 日期 | 史前4713年到西元5874897年 |
time | 8bytes | 時間 | 00:00:00 到 24:00:00 |
interval | 16bytes | 時間區隔 | +/- 178,000,000年 |
其他
類型 | 值 |
---|---|
布林 | true/false |
地理 | 點、線、圓圈、二維物件 |
IP/MAC | IP、MAC位址 |
UUID | 不重複的編號 |
JSON、XML | 儲存這些結構化格式的資訊 |