2013-04-24 114 views
2

我瞭解charvarchar之間的區別,但我不確定varchar的最大長度爲的確切含義。當我們存儲長度小於10的字符串時,varchar(10)和varchar(1000)之間是否有區別?

當我們存儲長度小於10的string時,varchar(10)varchar(100)之間是否有區別?

我認爲這兩種情況下使用相同的空間,並具有相同的性能。如果是這樣,爲什麼我們需要varchar max limit?

使用「varchar」而不是「varchar(xxx)」就足夠了嗎?我使用MySQL 5.0.67

+0

可能取決於您正在使用的產品。請爲特定的RDBMS產品添加標籤。 – 2013-04-24 06:25:43

+0

我使用的是MySQL,但paxdiablo的答案對我來說已經足夠了。無論如何,我已經添加了MySQL標籤 – firia2000 2013-04-25 02:45:25

回答

5

這完全取決於正在使用的DBMS引擎。 SQL本身並沒有規定物理存儲的方式,只是邏輯上看它們的方式。

例如,您的DBMS可能會在最大大小的行中分配空間,再加上一些額外的字節來存儲長度。在這種情況下,varchar(10)varchar(1000)之間會有很大的差異,因爲您會浪費相當多的每行空間。

或者,它可能爲varchar數據使用緩衝池,並且只存儲行中的長度和緩衝池「起始地址」。在這種情況下,無論數據大小如何,每一行都會存儲相同大小的信息,但是會增加一個步驟來提取該列中的實際數據(在連接到緩衝池之後)。

您使用varchar的原因恰恰就是它名爲varchar的原因。它允許您存儲可變大小的數據元素。通常,char(10)會爲您提供十個字符,無論如何,如果插入較短的內容,請用空格填充它。您可以在提取時刪除尾隨空格,但如果要存儲的數據實際上是"hello ",要保留的尾隨空格,那麼效果不佳。

一個體面的DBMS引擎可能決定取決於varchar列的最大大小進行權衡。簡而言之,它可以將其直接存儲在行中,並佔用大小的額外字節。

更長varchar列可以被「外包」給一個單獨的緩衝池,以確保行讀數保持有效的(至少在您需要varchar列,反正)。

你需要做的是重新問你的具體DBMS的問題,以獲得更有針對性的答案。

或者,誠實地說,設計你的數據庫只存儲最大尺寸。如果你知道它是10,那麼varchar(1000)是浪費。如果將來您需要放大色譜柱,是該做的時間,而不是現在(見YAGNI)。


對於MySQL,您需要查看在線文檔的Chapter 14 Storage Engines。它涵蓋了MySQL使用的各種存儲引擎(如InnoDB和MyISAM),並且看起來足夠深入,可以看到信息是如何物理存儲的。

例如,在MyISAM中,表中存在可變長度數據(包括varchar)通常表示dynamic tables。這遵循了與上面提到的緩衝池概念大致類似的方案,其優點是可變大小的列浪費的空間更少,以及行可能變得分散的缺點。

其他存儲格式(折扣壓縮格式,因爲它只用於只讀表格)是static one,其中數據存儲在單個物理行中。

關於InnoDB物理結構的信息可以在here找到。根據您使用的是Antelope還是Barracuda文件格式,最終會出現「所有信息都是物理行」或「緩衝池」的情況,類似於MyISAM的動態和靜態區分。

0

在Oracle中,Varchar的大小取決於它的用途,直到您設置限制的點。這意味着實際上,包含2個字符的varchar(10)和varchar(100)使用相同的空間(對於始終使用完整分配空間的char,這是不同的)。

1

在SQL Server中,限制不會影響數據在磁盤上的存儲方式。但它所提供的是免費的一個約束。如果你作爲數據庫設計師只想存儲多達10個字符,那麼你就會阻止某人存儲小說。

是否足夠只使用 「VARCHAR」

再次,對於SQL Server,幾乎可以肯定不是你想要的。在大多數情況下,如果你沒有指定限制,你會得到一個varchar(1)(肯定是有史以來最無意義的數據類型)。偶爾,這是一個varchar(30)

相關問題