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