2011-09-06 65 views
13

參考關於Character Types的Postgres文檔,我不清楚指定字符變化(varchar)類型的長度。爲什麼指定字符變化類型的長度

假設:

  • 字符串的長度,不要緊的應用。
  • 你不在乎別人把數據庫中的最大尺寸
  • 你有無限的硬盤空間

它確實提到:

的短字符串的存儲需求(最多126字節)爲1字節 加上實際字符串,其中包括字符 的空格填充。較長的字符串具有4字節的開銷而不是1. 長字符串被系統自動壓縮,因此磁盤上的物理需求可能會更少。非常長的值也存儲在背景表中,因此它們不會影響對較短列值的快速訪問。無論如何,可以存儲的最長可能的 字符串大約爲1 GB。 (在數據類型聲明中允許爲n的最大值爲 小於 那麼改變它是沒有用的,因爲使用多字節 字符編碼的字符數和字節數可以相當 不同

這談論串的大小,而不是字段的大小(即聽起來像它會永遠壓縮在一個大的varchar字段一個大的字符串,而不是在一個大的varchar字段小弦?)

我問這個問題,因爲它會更容易(和懶惰)指定一個更大的大小,所以你永遠不必擔心有一個字符串太l ARGE。例如,如果我爲地名指定varchar(50),我將獲得具有更多字符的位置(例如Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch),但是如果指定varchar(100)或varchar(500),我不太願意得到該問題。

如果你最大的字符串是400字符長,那麼你會在varchar(500)和(任意)varchar(5000000)或text()之間得到性能命中嗎?

如果任何人有答案,並且知道其他數據庫的答案,請加上。

我已經使用了Google,但沒有找到足夠的技術性解釋。

回答

11

我的理解是,對於數據完整性有限制是有用的,因此我使用列大小來驗證較低層的數據項並更好地描述數據模型。

對此事的一些鏈接:

+8

與使用'varchar(nn)'相比,使用'text'(或'varchar')以及限制長度的檢查約束更靈活一些。改變長度限制就像刪除和重新創建檢查約束一樣簡單,而一個ALTER TABLE可以擴展例如varchar(20)到varchar(50)在大型表上非常耗時,並在該表上放置排他鎖。 –

+0

偉大的鏈接...! –

5

我的理解是,這是舊數據庫存儲的遺留問題,並不像Postgres那樣靈活。有些人會使用固定長度的結構來很容易地找到特定的記錄,而且由於SQL是一種有點標準化的語言,即使它沒有提供任何實際的好處,它仍然可以看到。因此,對於Postgres,您的「變大」方法應該是一個完全合理的方法,但它可能無法很好地傳遞給其他不太靈活的RDBMS系統。

2

文檔解釋了這一點:

如果字符改變我在沒有使用長度說明符的情況下,該類型接受任何大小的字符串。後者是PostgreSQL擴展。

SQL標準要求所有類型的長度規範。這可能主要是出於遺留原因。在PostgreSQL用戶中,首選項傾向於省略長度說明,但如果要編寫可移植代碼,則必須包含它(並在許多情況下選擇任意大小)。

1

另外兩個想法:

  1. Postgres的醫生說那是很長的值也存儲在後臺表「。因此,將所有字符串定義爲無界可能會將它們推送到背景表格中 - 當然,性能會受到影響。

  2. 聲明一切都很長會干擾DB預測查詢執行計劃的努力,因爲它對數據的瞭解較少。

  3. 構建一個包含索引的b-tree也會被拋棄,因爲它無法猜測合理的打包策略。例如,如果性別是TEXT,你怎麼知道它全是M或F?

相關問題