在建立資料表的過程中,我們需要對新建立的資料表定義欄位結構。
每個欄位都必須給它屬性,例如 文字、數字、日期 這些最常見。
我們前幾天有建立一張 animals 資料表,sql 語法如下
CREATE TABLE animals (
    id bigserial,
    name varchar(255),
    created_at timestamp,
    updated_at 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 | 儲存這些結構化格式的資訊 |