當你在 PostgreSQL 處理文字資料時,主要有三個主角:CHAR、VARCHAR 跟 TEXT。每一種都有自己的特色、優點跟小細節。來,我們一個一個搞懂它們。
CHAR(n)
CHAR,也就是 character,是固定長度 n 的字串。如果你存進去的字串比指定的長度短,系統會自動幫你補空白。
範例:
| id | code - CHAR(5) |
|---|---|
| 1 | ''ABC'' |
這種型別很適合用在所有字串都要一樣長度的情境(像是代碼、條碼或是固定長度的識別碼)。
但如果你要處理長度不一樣的文字,這些補的空白只會白白佔用資料庫空間。
VARCHAR(n)
VARCHAR,也就是 variable character,是用來存放可變長度的字串,但有最大長度 n 的限制。
範例:
| id | username - VARCHAR(10) |
|---|---|
| 1 | ''Alice'' |
這種型別很省空間,因為只會存實際的字串內容。不過缺點就是你一定要設定最大長度。如果字串超過這個限制,資料庫會直接報錯。
TEXT
TEXT 是沒有長度限制的字串型別。當你不確定文字會長到多長時,這個型別超好用。
範例:
| id | content - TEXT |
|---|---|
| 1 | ''This is a long piece of text. No limits!'' |
優點:可以存任何長度的文字,不用擔心限制。
缺點:沒有限制有時會讓資料庫變得很肥,尤其是文字內容暴增的時候。
文字型別資料比較
處理文字時,選對型別很重要。來看看 CHAR、VARCHAR 跟 TEXT 的主要差異:
| 型別 | 長度 | 效能 | 什麼時候用? |
|---|---|---|---|
CHAR(n) |
固定 | 固定長度字串時比較快 | 用在固定長度的代碼(像是 ISO) |
VARCHAR(n) |
最大長度 n |
有限制長度時比 TEXT 快 |
用在已知最大長度的可變字串 |
TEXT |
沒有限制 | 最通用 | 用在長度難以預測的長文字 |
實用範例
來看看這些型別在實際情境下怎麼用。
範例 1:用 CHAR 存固定長度代碼
假設你有個資料庫要存城市代碼,格式是 ISO 3166-1 alpha-3,每個代碼一定是 3 個字元。
| city_id | city_name - VARCHAR(50) | iso_code - CHAR(3) |
|---|---|---|
| 1 | New York | NYC |
| 2 | Los Angeles | LAX |
| 3 | Chicago | CHI |
這裡 CHAR(3) 超適合,因為每個城市的 ISO 代碼長度都一樣。
範例 2:用 VARCHAR 存使用者名稱
使用者名稱就是 VARCHAR 的經典應用。雖然長度不一樣,但你大概知道不會超過 50 個字元。
| user_id | username - VARCHAR(50) | email - VARCHAR(50) |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
這時用 VARCHAR 很省空間,因為實際字串通常比 50 短。
範例 3:用 TEXT 存說明文字
假設你有個部落格,每篇文章都要存很長的說明。這時 TEXT 就是最佳選擇。
| post_id | title - VARCHAR(100) | content - TEXT |
|---|---|---|
| 1 | Post 1 | This is a very long blog post content that goes on and on... |
如果你根本不知道文字會多長,TEXT 就超適合。
4. 其他細節跟小陷阱
用文字型別時,有些小細節要注意,才不會踩雷。
問題:CHAR 會自動補空白
如果你直接比對 CHAR 欄位的字串,沒考慮到補的空白,可能會查不到資料。
SELECT * FROM cities WHERE iso_code = 'NYC';
-- 什麼都查不到,因為沒去掉空白
怎麼解決:用 TRIM() 把空白去掉。
SELECT * FROM cities WHERE TRIM(iso_code) = 'NYC';
問題:VARCHAR 長度限制會報錯
如果你塞進去的字串超過 VARCHAR 的最大長度,資料庫會直接報錯。
INSERT INTO users (username, email) VALUES ('A_username_that_is_too_long_for_field', 'test@example.com');
-- 錯誤
怎麼解決:記得設定的長度(n)要符合實際需求。或者直接用 TEXT,就不用擔心限制。
問題:TEXT 可能讓資料庫變胖
TEXT 可以存無限長的資料,結果可能讓表格變超大,索引也會變難搞。
怎麼避免:如果你打算對 TEXT 欄位大量建立索引,可以考慮用有限長度的 VARCHAR。
GO TO FULL VERSION