表 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 位元組 | 物件名稱內部型別 |
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。