表 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
地區設定會認為空格大於換行符。將 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 位元組 | 物件名稱的內部類型 |
如果您在文件中發現任何不正確的地方,或者與您使用特定功能的經驗不符,或需要進一步澄清,請使用此表單來報告文件問題。