支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

8.3. 字元類型 #

表 8.4. 字元類型

名稱 描述
character varying(n)varchar(n) 具有長度限制的可變長度
character(n)char(n)bpchar(n) 固定長度,以空白填補
bpchar 可變無限制長度,空白修剪
text 可變無限制長度

表 8.4 顯示了 PostgreSQL 中可用的通用字元類型。

SQL定義了兩種主要的字元類型:character varying(n)character(n),其中 n 是一個正整數。這兩種類型都可以儲存長度最多為 n 個字元(而不是位元組)的字串。嘗試將較長的字串儲存到這些類型的資料行中將會導致錯誤,除非多出的字元都是空格,在這種情況下,字串將被截斷為最大長度。(這個有點奇怪的例外是SQL標準所要求的。)但是,如果明確地將一個值轉換為 character varying(n)character(n),則超出長度的值將被截斷為 n 個字元,而不會引發錯誤。(這也是SQL標準所要求的。)如果要儲存的字串短於宣告的長度,則 character 類型的值將會以空格填補;character varying 類型的值將只儲存較短的字串。

此外,PostgreSQL 提供了 text 類型,它可以儲存任何長度的字串。雖然 text 類型不在SQL標準中,但其他幾個 SQL 資料庫管理系統也具有它。textPostgreSQL 的原生字串資料類型,因為大多數對字串進行操作的內建函數都被宣告為接受或傳回 text 而不是 character varying。在許多情況下,character varying 的作用就像它是 text 的一個 網域 一樣。

類型名稱 varcharcharacter varying 的別名,而 bpchar(帶有長度指定符)和 char 則是 character 的別名。varcharchar 別名定義在SQL標準中;bpcharPostgreSQL 的延伸。

如果指定了長度 n,則它必須大於零且不能超過 10,485,760。如果 character varying(或 varchar)在使用時沒有長度指定符,則該類型會接受任何長度的字串。如果 bpchar 缺少長度指定符,它也會接受任何長度的字串,但尾隨空格在語義上並不重要。如果 character(或 char)缺少指定符,則它等同於 character(1)

character 類型的值在物理上會以空格填補到指定的寬度 n,並以這種方式儲存和顯示。但是,在比較兩個 character 類型的值時,尾隨空格被視為語義上不重要並被忽略。在空格具有重要意義的定序中,此行為可能會產生意想不到的結果;例如,SELECT 'a '::CHAR(2) collate "C" < E'a\n'::CHAR(2) 會傳回 true,即使 C 地區設定會認為空格大於換行符。將 character 值轉換為其他字串類型時,會移除尾隨空格。請注意,尾隨空格在 character varyingtext 值中,以及在使用模式比對時(即 LIKE 和正則表達式)具有語義意義的。

可以儲存在任何這些資料類型中的字元,取決於資料庫字元集,該字元集是在建立資料庫時選擇的。無論使用何種特定的字元集,代碼為零的字元(有時稱為 NUL)都無法儲存。更多資訊請參考第 23.3 節

短字串(最多 126 個位元組)的儲存需求是 1 個位元組加上實際字串,其中包含 character 情況下的空格填充。較長的字串則使用 4 個位元組的額外開銷,而不是 1 個位元組。系統會自動壓縮長字串,因此磁碟上的實際需求可能會更少。非常長的值也會儲存在背景資料表中,這樣它們就不會干擾對較短欄位值的快速存取。無論如何,可以儲存的最長字元字串大約是 1 GB。(資料類型宣告中 n 允許的最大值會小於此值。變更此值沒有意義,因為在使用多位元組字元編碼時,字元和位元組的數量可能大不相同。如果您希望儲存沒有特定上限的長字串,請使用沒有長度規範的 textcharacter varying,而不是創建一個隨意的長度限制。)

提示

這三種類型之間沒有效能差異,除了使用空白填充類型時儲存空間增加,以及在儲存到長度限制的欄位中時需要額外的 CPU 週期來檢查長度。雖然 character(n) 在某些其他資料庫系統中具有效能優勢,但在 PostgreSQL 中沒有這種優勢;事實上,由於其額外的儲存成本,character(n) 通常是三者中最慢的。在大多數情況下,應使用 textcharacter varying 代替。

關於字串常值的語法資訊,請參閱第 4.1.2.1 節,關於可用運算符和函數的資訊,請參閱第 9 章

範例 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)); -- explicit truncation
SELECT b, char_length(b) FROM test2;

   b   | char_length
-------+-------------
 ok    |           2
 good  |           5
 too l |           5

(1)

char_length 函數在第 9.4 節中討論。


PostgreSQL 中還有另外兩種固定長度的字元類型,如表 8.5所示。它們不適用於通用用途,僅用於內部系統目錄。 name 類型用於儲存識別符。它的長度目前定義為 64 個位元組(63 個可用字元加上終止符),但應在 C 原始碼中使用常數 NAMEDATALEN 來引用。長度是在編譯時設定的(因此可以根據特殊用途進行調整);預設的最大長度可能會在未來的版本中變更。類型 "char"(注意引號)不同於 char(1),因為它僅使用一個位元組的儲存空間,因此只能儲存單個 ASCII 字元。它在系統目錄中用作簡化的列舉類型。

表 8.5. 特殊字元類型

名稱 儲存大小 描述
"char" 1 位元組 單一位元組內部類型
name 64 位元組 物件名稱的內部類型

提交更正

如果您在文件中發現任何不正確的地方,或者與您使用特定功能的經驗不符,或需要進一步澄清,請使用此表單來報告文件問題。