Postgresql

我應該向 VARCHAR 列添加任意長度限制嗎?

  • July 17, 2020

根據PostgreSQL 的文件VARCHAR,VARCHAR(n)TEXT.

我應該向名稱地址列添加任意長度限制嗎?

**編輯:**不是欺騙:

我知道這種CHAR類型是過去的遺物,我不僅對性能感興趣,而且對其他優點和缺點感興趣,比如 Erwin 在他驚人的回答中所說的。

答案是否定的。

Postgres Wiki 中的相關建議。

varchar如果不需要,請不要添加長度修飾符。(大多數時候,你不會。)只text用於所有字元數據。varchar如果您需要與沒有text通用字元串類型的 RDBMS 保持兼容,請使其(標準 SQL 類型)不帶長度修飾符。

性能幾乎相同,在text少數情況下會更快一些,並且您可以保存週期以檢查長度。有關的:

如果您確實需要強制執行最大長度,varchar(n)這是一個有效的選擇,但我仍然會考慮text使用如下CHECK約束

ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 51);

您可以隨時修改或刪除此類約束,而不必弄亂表定義和依賴對象(視圖、函式、外鍵……)。您可以在(相同)約束中強制執行其他要求。

長度修飾符用於導致像這樣這樣這樣的問題……

PostgreSQL 9.1 引入了一個新特性來減輕痛苦。發行說明:

允許ALTER TABLE ... SET DATA TYPE在適當的情況下避免表重寫 (Noah Misch, Robert Haas)

例如,將varchar列轉換為文本不再需要重寫表。但是,增加列的長度約束 varchar仍然需要重寫表。

更多問題varchar(n)已在以後的版本中得到修復。

引用自:https://dba.stackexchange.com/questions/20974