表 8.4. 字元類型
名稱 | 描述 |
---|---|
character varying( 、varchar( |
長度可變,有長度限制 |
character( 、char( 、bpchar( |
固定長度,空白填充 |
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 資料庫管理系統也具有它。text
是 PostgreSQL 的原生字串資料類型,因為大多數對字串進行操作的內建函數都被宣告為採用或返回 text
而不是 character varying
。在許多情況下,character varying
的行為就像它是 text
上的 域。
類型名稱 varchar
是 character varying
的別名,而 bpchar
(帶長度指定符)和 char
是 character
的別名。varchar
和 char
別名是在SQL標準中定義的; bpchar
是一個 PostgreSQL 擴充功能。
如果指定,長度 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
locale 會認為空格大於換行符號。將 character
值轉換為其他字串類型時,尾隨空格會被移除。請注意,尾隨空格在 character varying
和 text
值中,以及在使用模式比對時(即 LIKE
和正規表示式),在語意上很重要。
任何這些資料類型中可以儲存的字元,取決於資料庫的字元集,該字元集是在建立資料庫時選取的。無論具體的字元集是什麼,都無法儲存代碼為零的字元(有時稱為 NUL)。有關更多資訊,請參閱第 23.3 節。
短字串(最多 126 個位元組)的儲存需求是 1 個位元組加上實際字串,其中包括 character
的空格填補。較長的字串會有 4 個位元組的額外負擔,而不是 1 個。長字串會被系統自動壓縮,因此磁碟上的實際需求可能會較少。非常長的值也會儲存在背景表格中,以避免干擾對較短欄位值的快速存取。在任何情況下,可以儲存的最長字元串約為 1 GB。(資料類型宣告中允許的 n
最大值會小於該值。更改此值沒有意義,因為使用多位元組字元編碼時,字元數和位元組數可能會有很大的不同。如果您希望儲存沒有特定上限的長字串,請使用沒有長度指定器的 text
或 character varying
,而不是編造任意的長度限制。)
這三種類型之間沒有效能差異,除了使用空白填補類型時儲存空間增加,以及在儲存到長度受限的欄位時需要額外的 CPU 週期來檢查長度。雖然 character(
在某些其他資料庫系統中具有效能優勢,但在 PostgreSQL 中沒有這種優勢;事實上,由於其額外的儲存成本,n
)character(
通常是三者中最慢的。在大多數情況下,應改用 n
)text
或 character 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
在 PostgreSQL 中還有其他兩種固定長度的字元類型,如表 8.5所示。這些並非用於通用目的,僅用於內部系統目錄中。name
類型用於儲存識別符。它的長度目前定義為 64 個位元組(63 個可用字元加上終止符),但應在 C
原始程式碼中使用常數 NAMEDATALEN
引用。長度是在編譯時設定的(因此可以針對特殊用途進行調整);預設最大長度可能會在未來的版本中變更。"char"
類型(請注意引號)與 char(1)
不同,因為它只使用一個位元組的儲存空間,因此只能儲存單個 ASCII 字元。它在系統目錄中用作簡化的枚舉類型。
表 8.5. 特殊字元類型
名稱 | 儲存空間大小 | 描述 |
---|---|---|
"char" |
1 個位元組 | 單一位元組內部類型 |
name |
64 個位元組 | 用於物件名稱的內部類型 |
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。