CodeGym /課程 /SQL SELF /文字型別資料: CHARVARCHAR

文字型別資料: CHARVARCHARTEXT

SQL SELF
等級 15 , 課堂 2
開放

當你在 PostgreSQL 處理文字資料時,主要有三個主角:CHARVARCHARTEXT。每一種都有自己的特色、優點跟小細節。來,我們一個一個搞懂它們。

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!''

優點:可以存任何長度的文字,不用擔心限制。

缺點:沒有限制有時會讓資料庫變得很肥,尤其是文字內容暴增的時候。

文字型別資料比較

處理文字時,選對型別很重要。來看看 CHARVARCHARTEXT 的主要差異:

型別 長度 效能 什麼時候用?
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

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION