8.3. 字元類型

Table 8-4. 字元類型

名字描述
character varying(n), varchar(n)變長,有長度限制
character(n), char(n)定長,不足補空白
text變長,無長度限制

Table 8-4 顯示了在 PostgreSQL 裡可用的一般用途的字元類型。

SQL 定義了兩種基本的字元類型: character varying(n)character(n), 這裡的 n 是一個正整數。兩種類型都可以儲存最多 n 個字元長的字串。 試圖儲存更長的字串到這些類型的字串裡會產生一個錯誤, 除非超出長度的字元都是空白,這種情況下該字串將被截斷為最大長度。 (這個看上去有點怪異的例外是SQL標準要求的。) 如果要儲存的字串比聲明的長度短, 類型為 character 的數值將會用空白填滿; 而類型為 character varying 的數值將只是儲存短些的字串。

如果我們明確地把一個數值轉換成 character(n) 或者 character varying(n), 那麼超長的數值將被截斷成 n 個字元,而不會拋出錯誤。(這也是SQL標準的要求。)

注意: PostgreSQL7.2 以前,太長的字串總會被不聲不響地卡喳掉, 而且不會生成錯誤。不管是明確的還是隱含的轉換情況下。

char(n)varchar(n) 的概念分別是 character(n)character varying(n) 的別名, 沒有長度聲明詞的character 等於 character(1);如果不帶長度說明詞使用 character varying,那麼該類型接受任何長度的字串。 後者是PostgreSQL的擴展。

另外,PostgreSQL 提供 text 類型,它可以儲存任何長度的字串。 儘管類型 text 不是SQL標準,但是許多其它 SQL 資料庫系統也有它。

類型 character 的數值實際上都用空白填充到指定的長度 n, 並且以這種方式儲存和顯示。不過,填充的空白在語意上是無所謂的。 在比較兩個 character 的值的時候,填充的空白都不會被關注, 在轉換成其它字串類型的時候,character 值裡面的空白會被刪除。 請注意,在 character varyingtext 數值裡, 結尾的空白語意上是有含義的。

這些類型的儲存需求是 4 字元加上實際的字串,如果是 character 的話再加上填充的字元。長的字串將會自動被系統壓縮, 因此在磁盤上的實際需求可能會更少些。長的數值也會儲存在後台資料表裡面,這樣它們就不會干擾對短字串值的快速訪問。 不管怎樣,允許儲存的最長字串大概是 1 GB。 (允許在資料類型聲明中出現的的 n 的最大值比這還小。 修改這個行為沒有甚麼意義,因為在多字元編碼下字元和字元的數目可能差別很大。 如果您想儲存沒有特定上限的長字串,那麼使用 text 或者沒有長度聲明詞的 character varying, 而不要選擇一個任意長度限制。)

提示: 這三種類型之間沒有性能差別,只不過是在使用填充空白的類型的時候增加了儲存尺寸。 雖然在某些其它的資料庫系統裡,character(n) 有一定的性能優勢, 但在 PostgreSQL 裡沒有。在大多數情況下,應該使用 text 或者 character varying

請參考 Section 4.1.2.1 獲取關於字串文本的語法的訊息, 以及參閱 Chapter 9 獲取關於可用操作符和函數的訊息。 資料庫的字元集決定用於儲存文本值的字元集;有關字元集支援的更多訊息, 請參考 Section 20.2

Example 8-1. 使用字元類型

CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- (1)
  a   | char_length
------+-------------
 ok   |           2

CREATE TABLE test2 (b varchar(5));
INSERT INTO test2 VALUES ('ok');
INSERT INTO test2 VALUES ('good      ');
INSERT INTO test2 VALUES ('too long');
ERROR:  value too long for type character varying(5)
INSERT INTO test2 VALUES ('too long'::varchar(5)); -- 明確截斷
SELECT b, char_length(b) FROM test2;
   b   | char_length
-------+-------------
 ok    |           2
 good  |           5
 too l |           5
(1)
函數 char_lengthSection 9.4中討論。

PostgreSQL 裡另外還有兩種定長字元類型。 在 Table 8-5 裡顯示。 name類型用於在內部系統資料表中儲存標識符並且不是給一般用戶使用的。 該類型長度目前定為 64 字元 (63 可用字元加結束符)但應該使用常量 NAMEDATALEN 引用。這個長度是在編譯的時候設置的,(因而可以為特殊用途調整); 預設的最大長度在以後的版本可能會改變。 類型 "char" (注意引號)和 char(1) 是不一樣的,它只用了一個字元的儲存空間。它在系統內部用於系統資料表當做窮人的枚舉類型用。

Table 8-5. 特殊字元類型

名字儲存空間描述
"char"1 字元單字元內部類型
name64 字元用於對像名的內部類型