[PostgreSQL] 8.3. 字元類型

  • 2091
  • 0
  • 2013-07-31

摘要:[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 內部使用,

非給一般使用者使用。

 

參考:

[1] 8.3. Character Types

[2] PostgreSQL: Difference between text and varchar (character varying)