摘要:[PostgreSQL] 8.3. 字元類型
SQL 定義 2 種主要的文字類型:varchar(n)、char(n),
n 為正整數,代表字數而非佔用的 bytes ( 因 bytes 會因編碼方式而改變 ),
欲儲存的字串字數超過 n 就會發生錯誤,
但如果超過的部分全都是空白字元,
則字串會被截斷至長度 n 且不會發生錯誤。
儲存的字串字數不足 n 時,
char(n) 會補上空白至長度 n,
varchar(n) 不會。
字串明確轉換為 varchar(n) 或 char(n) 時,
長度超過的部分會被截斷而不會發生錯誤:
select 'ABCDE'::varchar(3); -- OK
select 'ABCDE'::char(3); -- OK
省略字串長度 n 的 char 等同於 char(1),
省略字串長度的 varchar 等同於 text,
可接受任意長度的字串,
varchar 與 text 皆為 PostgreSQL 延伸功能,
非 SQL 標準。
雖然 char(n) 填充用的的空白字元在儲存與顯示時都會有空白,
但在這些空白在語義上是無義意的,
字串比較時會被忽略,轉換為其他字串類型時也會被移除:
select 'The same' where '123 '::char(5) = '123' -- the same
varchar(n)、varchar、text 類型後方的空白則是有義意的:
select 'The same' where '123 '::varchar(5) = '123' -- not the same
小於等於 126 bytes 的字串使用空間為 n bytes + 1 bytes,
大於 126 bytes 的字串使用空間為 n bytes + 4 bytes,
長字串會被自動壓縮以減少所需磁碟空間,
超長字串甚至會被儲存在背景表格 (background tables) 才不會影響存取速度。
字串最大的儲存空間大約為 1GB,
大於 n 的允許最大值,
當你要儲存無長度上限的字串,
請使用 text 或 varchar。
提示:
varchar(n)、char(n)、text 三者的效能沒有明顯的差別,
char(n) 的填充字元會佔用多餘的儲存空間,
varchar(n)、char(n) 儲存時會稍稍暫用一點 CPU 時間以檢查字串長度,
某些 DBMS 使用 char(n) 有較好的效能,在 PostgreSQL 則不然,
反而因為使用多餘的儲存空間而變差,
在大多情境下,使用 text 或 varchar 較為合適。
PostgreSQL 還有兩個固定長度字元類型 "char" 與 name 供 PostgreSQL 內部使用,
非給一般使用者使用。
參考:
[2] PostgreSQL: Difference between text and varchar (character varying)